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



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

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

当我使用cool edit播放解码时,它比原始pcm更快。

我的参数肯定有问题。有人使用作品可以帮助我吗。非常感谢。

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编解码器支持立体声和单声道信号,编码器的相应配置是您在调用opus_encoder_create函数时指定的channels参数。

此外,您还需要了解OPUS编解码器支持的帧大小。它支持具有:2.5、5、10、20、40或60ms音频数据的帧。

16kHz的一毫秒音频是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数据包。

所以,您对从缓冲区接收的一个缓冲区中的两个或四个数据包进行编码。

最新更新