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

3

函数opus_encode需要帧大小作为参数。在API文档中,缓冲区大小是每个通道的样本数。 但是,如何确定应该使用哪个大小?

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

当我使用Cool Edit播放解码后的文件时,它比原始PCM快。

我的参数肯定有些问题。是否有任何使用opus的人可以帮助我。 非常感谢。

1个回答

10

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或60毫秒音频数据的帧。
16kHz的一毫秒音频为16个采样值(16000/1000)。因此,对于单声道,您可以将frame_size设置为:
  • 16*2.5=40(非常少见)
  • 16*5=80(罕见)
  • 16*10=160
  • 16*20=320
  • 16*40=640
  • 16*60=960
OPUS编解码器不接受其他大小,处理1280个采样值的缓冲区最佳方法是拆分为四个20毫秒数据包或两个40毫秒数据包。
因此,您可以从接收到的缓冲区编码两个或四个数据包。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接