解码Ogg / Opus文件

时间:2016-06-14 15:29:39

标签: c++ opus

我有一小段C ++代码尝试打开ogg / opus编码文件并使用opus API以使用函数opus_decode()对其进行解码。问题是,几乎一半的opus_decode()调用我为相同的声音返回负(错误)代码.. -4和-2(无效的包和缓冲区太短)我无法解决。输出就像

  

N解码:960 N解码:-4 N解码:-4 N解码:960 N解码:   -4 N解码:1920 N解码:960 N解码:-4 N解码:-4

等等。

#include <string.h>
#include <opus/opus.h>
#include <stdio.h>
#include <stdlib.h>
#include <cstdio>
#include <iostream>
#include <fstream>

#define LEN 1024
#define FREQ 48000
#define CHANNELS 1
#define FRAMESIZE 1920

int main(int argc, char *argv[]) {

    int size = opus_decoder_get_size(CHANNELS);

    OpusDecoder *decoders = (OpusDecoder*)malloc(size);
    int error = opus_decoder_init(decoders, FREQ, CHANNELS);

    std::ifstream inputfile;
    inputfile.open("/home/vir/Descargas/detodos.opus"); //48000Hz, Mono

    char input[LEN];

    opus_int16 *data = (opus_int16*)calloc(CHANNELS*FRAMESIZE,sizeof(opus_int16));


    if(inputfile.is_open())
        while (!inputfile.eof()) {

            inputfile >> input;         

            std::cerr << "N decoded: " << opus_decode(decoders, (const unsigned char*)&input[0], LEN, data, FRAMESIZE, 0)  << "\n";

        }


    return error;
}

1 个答案:

答案 0 :(得分:6)

您似乎正在使用Opus-Tools而不是OpusFile。显然,您已链接到libopus.a库,但您还需要下载并构建OpusFile 0.7,并将您的程序与构建OpusFile时创建的libopusfile.a链接起来。在OpusFile 0.7的程序中包含opusfile.h。最后,您需要从xiph.org/downloads下载libogg 1.3.2下载并构建libogg库,并链接到该库。

This link是解释如何打开和关闭ogg opus流以进行解码的文档。

确保您拥有ogg opus文件并使用...

打开流
OggOpusFile *file = op_open_file(inputfile, error)(inputfile is char* inputfile and error is an int pointer)

使用op_free(file)关闭流。这是实际解码ogg opus流的function documentation。在使用...

调用op_free解码音频数据之前
op_read(file,buffer,bufferSize,null), buffer is opus_int16 pcm[120*48*2]

bufferSizesizeof(pcm)/sizeof(*pcm)op_read将解码更多文件,因此请将其置于for循环中,直到op_read返回0