Audio ffmpeg音频编码器帧大小
我需要将音频数据从AV_CODEC_ID_PCM_S16LE转换为AV_CODEC_ID_PCM_ALAW,我以代码为例。示例代码基本上就是这样做的(为了简洁起见,省略了错误检查): 示例代码随后在for循环中使用Audio ffmpeg音频编码器帧大小,audio,encoding,ffmpeg,Audio,Encoding,Ffmpeg,我需要将音频数据从AV_CODEC_ID_PCM_S16LE转换为AV_CODEC_ID_PCM_ALAW,我以代码为例。示例代码基本上就是这样做的(为了简洁起见,省略了错误检查): 示例代码随后在for循环中使用c->frame\u size 我的代码与上述代码类似,但有以下区别: const AVCodec* codec = avcodec_find_encoder(AV_CODEC_ID_PCM_ALAW); c->sample_rate = 8000; c->chann
c->frame\u size
我的代码与上述代码类似,但有以下区别:
const AVCodec* codec = avcodec_find_encoder(AV_CODEC_ID_PCM_ALAW);
c->sample_rate = 8000;
c->channel_layout = AV_CH_LAYOUT_MONO;
c->channels = 1;
调用avcodec\u open2
后,c->frame\u size
为零。示例代码从不设置帧大小,因此我假设它需要avcodec\u alloc\u context3
或avcodec\u open2
来设置它。这是正确的假设吗?帧大小的设置是否基于所使用的编解码器?如果我必须明确设置帧大小,是否有建议的大小
编辑:
根据@kamilz的回答,示例代码似乎不够健壮。该示例假定将设置
c->frame\u size
,但这似乎取决于编解码器。在我的例子中,codec->capabilities
实际上被设置为AV\u codec\u CAP\u VARIABLE\u FRAME\u SIZE
。所以我修改了我的代码来检查c->frame\u size
,并且只有当它不是零时才使用它。如果为零,我只是为FFmpeg文档中提到的帧->nb_样本
选取了任意一秒的数据:
int-AVCodecContext::frame\u size
音频帧中每个通道的采样数
编码
:由avcodec\u open2()中的libavcodec设置。每个提交的帧(最后一个帧除外)必须精确地包含每个频道的frame\u size
样本。
当编解码器设置了AV\u codec\u CAP\u VARIABLE\u FRAME\u SIZE
时,可能是0
,然后
帧大小不受限制。
解码
:可由一些解码器设置以指示恒定的帧大小
希望有帮助。您不需要明确控制帧大小,它是由编码器根据初始化(打开)时提供的编解码器设置的
一旦avcodec_open2()
成功,您就可以使用检索帧的缓冲区大小,对于nb_样本
,我应该传递给av_samples_get_buffer_size()
什么值?:)好的,对不起,我的错了
const AVCodec* codec = avcodec_find_encoder(AV_CODEC_ID_PCM_ALAW);
c->sample_rate = 8000;
c->channel_layout = AV_CH_LAYOUT_MONO;
c->channels = 1;