Audio ffmpeg音频编码器帧大小

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

我需要将音频数据从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->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;