函数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数据包。
所以,您对从缓冲区接收的一个缓冲区中的两个或四个数据包进行编码。