如何确认opus编码缓冲区大小?

时间:2017-10-17 09:30:33

标签: android opus

函数opus_encode需要帧大小作为参数。在api doc中,它表示缓冲区大小是每个通道的样本数。 但是如何确定我应该使用哪种尺寸?

我在android中使用opus。采样率16k,缓冲区大小1280.当我在编码和解码时将帧大小设置为640时,解码文件的长度是原始pcm的一半。当我设置为960时,解码文件是原始pcm的2/3。但设置为1280,编码将返回-1作为arg错误。

当我使用酷编辑播放解码时,它比原始pcm快。

我的参数必须有一些东西。 是否有人使用opus可以帮助我。 非常感谢。

1 个答案:

答案 0 :(得分:1)

Opus编码定义:

opus_int32 opus_encode  ( OpusEncoder *         st,
                          const opus_int16 *    pcm,
                          int                   frame_size,
                          unsigned char *       data,
                          opus_int32            max_data_bytes )

指定frame_size时,需要将其设置为pcm缓冲区中每个可用通道的样本数。

OPUS编解码器支持立体声和单声道信号,编码器的相应配置是您在调用channels功能时指定的opus_encoder_create参数。

您还需要通过OPUS编解码器了解支持的帧大小。它支持以下帧:2.5,5,10,20,40或60 ms的音频数据。

16kHz的1毫秒音频是16个样本(16000/1000)。因此对于mono,您可以将frame_size指定为:

  • 16 * 2.5 = 40(非常罕见)
  • 16 * 5 = 80(罕见)
  • 16 * 10 = 160
  • 16 * 20 = 320
  • 16 * 40 = 640
  • 16 * 60 = 960

OPUS编解码器不接受其他尺寸。处理1280个样本的缓冲区大小的最佳方法是分割四个20ms的数据包或两个40ms的数据包。

因此,您从缓冲区接收的一个缓冲区中编码两个或四个数据包。