2016-11-01 88 views
1

我试图使用OPUS API的基本编码和解码功能与本公司主营:解码与作品API使用opus_decode_float

#include <stdlib.h> 
#include <errno.h> 
#include <string.h> 
#include <opus/opus.h> 
#include <stdio.h> 

int  main(int argc, char **argv) 
{ 
    OpusEncoder *enc; 
    OpusDecoder *dec; 
    unsigned char   *str; 
    float   frame = 0.32; 
    int   ret = 0; 
    int   error; 
    float   *returned; 

    if ((str = malloc(4096)) == NULL) 
    return (-1); 
    enc = opus_encoder_create (24000, 1, OPUS_APPLICATION_AUDIO, &error); 

    printf("ret = %d | input = %.2f\n", error, frame); 

    ret = opus_encode_float(enc, &frame, 480, str, 4096); 

    printf("ret = %d\n", ret); 

    dec = opus_decoder_create (24000, 1, &error); 
    ret = opus_decode_float(dec, str, ret, returned, 480, 0); 

    printf("ret = %d | res = %.2f\n", ret, returned[0]); 

    return (0); 
} 

麻烦的是,我试图通过0.32浮球使用opus_decoder_float对它进行编码和解码,但是当我试图打印我的结果时,我只能得到0.00,并且找不到使用此特定功能的任何示例。

我没有得到与RET值的错误信息,该程序打印:

ret = 0 | input = 0.32 
ret = 3 
ret = 480 | res = 0.00 

我怎样才能在返回浮动的0.32?

+0

建议检查像'enc'和'dec'这样的返回值。 – chux

回答

0

returned未初始化。 opus_decode_float()printf()接收到一个不确定值的指针。

// problem code 
    returned float   *returned; 
    ... 
    // What value is `returned`? 
    ret = opus_decode_float(dec, str, ret, returned, 480, 0); 
    printf("ret = %d | res = %.2f\n", ret, returned[0]); 

建议修复,分配内存。 opus_decode_float()

returned float   *returned; 
    ... 
    int frame_size = 480; 
    int channels = 1; // from `opus_encoder_create (24000, 1, ...` 

    returned = malloc(sizeof *returned * frame_size * channels); 
    assert(returned); 
    ret = opus_decode_float(dec, str, ret, returned, frame_size, 0); 

    printf("ret = %d | res = %.2f\n", ret, returned[0]); 
    free(returned); 

此外,正如我读docpcm下面需要一个指向一个大阵列的float(frame_size *信道),而不是仅仅1.

opus_int32 opus_encode_float(OpusEncoder *st, const float *pcm, 
    int frame_size, unsigned char *data, opus_int32 max_data_bytes) 

// Too small? 
float frame = 0.32; 
ret = opus_encode_float(enc, &frame, 480, str, 4096); 
+0

这可能是麻烦,虽然即使我说分配浮点数,我仍然得到0.00最后。 – sh5164

+0

@ S.Hochberg注意:代码中有许多_magic numbers_,如4096,24000,1,没有自证据的含义 - 这增加了理解代码的难度。例子:在各个地方最好使用像'int frame_size = 480;'和'frame_size'这样的东西,而不是'480'来清楚地表达对象的含义。 AFAIK 4096是错误的。为什么4096? – chux

+0

那么他们需要的缓冲区大小,所以出于测试目的,我没有想到这一点,只是将其设置为4096. 24000和1是Opus API对应于输入信号的采样率的数字,以及通道(1对应于单声道和2个立体声) – sh5164

0

作品具有2.5到6.5毫秒的先行,取决于编码器参数。因此,与输入相比,解码的输出将稍微延迟,并且对于采样精确的解码,您应该跳过解码器的初始采样,并在最后解码相同数量的额外采样。可以使用获得先行的样本的确切数目:

opus_int32 skip; 
opus_encoder_ctl(enc, OPUS_GET_LOOKAHEAD(&skip)); 

这意味着你应该跳过第一skip解码的样本来获得对应于输入的第一个样品的样品。

还请记住,它是有损压缩。虽然它的意图听起来与原始音色相同,但您不应该期望样本的值相同。