使用opus_decode_float

时间:2016-11-01 15:49:34

标签: c opus

我正在尝试使用OPUS api的基本编码和解码功能:

#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?

2 个答案:

答案 0 :(得分: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);

此外,当我阅读doc时,下面的pcm需要指向大量float(frame_size * channels)的指针,而不只是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);

答案 1 :(得分:0)

Opus的前瞻性为2.5到6.5毫秒,具体取决于编码器参数。因此,与输入相比,解码输出会稍微延迟,对于采样精确解码,您应跳过解码器的初始采样,并在结束时解码相同数量的额外采样。前瞻样本的确切数量可以使用以下方法获得:

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

这意味着您应该跳过第一个skip解码样本,以获得与第一个输入样本相对应的样本。

另请注意,它是有损压缩。虽然它的目的是与人类听众的声音相同,但您不应期望样本的值相同。