1

この main で 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 float を渡して opus_decoder_float でデコードしようとしていることですが、結果を印刷しようとすると 0.00 しか得られず、この特定の関数の使用例が見つかりません。

ret 値にエラー メッセージは表示されません。プログラムは次のように出力します。

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

返された float で 0.32 を取得するにはどうすればよいですか?

4

2 に答える 2

0

Opus には、エンコーダーのパラメーターに応じて、2.5 ~ 6.5 ミリ秒の先読みがあります。したがって、デコードの出力は入力に比べてわずかに遅れます。サンプル精度のデコードでは、デコーダーからこれらの最初のサンプルをスキップし、最後に同じ数の余分なサンプルをデコードする必要があります。先読みのサンプルの正確な数は、次を使用して取得できます。

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

つまりskip、入力の最初のサンプルに対応するサンプルを取得するには、最初にデコードされたサンプルをスキップする必要があります。

また、非可逆圧縮であることにも注意してください。人間のリスナーにはオリジナルと同じように聞こえるように意図されていますが、サンプルの値が同じであるとは思わないでください。

于 2016-11-19T23:12:24.307 に答える