2017-10-17 47 views
0

函数opus_encode需要帧大小作为参数。在API文件中说缓冲区大小是每个通道的采样数量。 但如何确定我应该使用哪种尺寸?如何确认opus编码缓冲区大小?

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

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

必须有一些关于我的参数。 有人使用opus可以帮助我。 非常感谢。

回答

1

作品编码定义:

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或60ms的音频数据。

1毫秒的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个采样的缓冲区大小的最佳方式是分割四个20ms数据包或两个40ms数据包。

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