[英]Why does avcodec_fill_audio_frame return -22 when only sample count is different?
我的问题很快得到解释:我必须使用FFmpeg(原始PCM到G.711 mu-law)对音频样本进行编码。 这是我的代码的罪魁祸首部分(在此示例中,我将原始参数明确表示出来):
AVFrame* frame = av_frame_alloc();
frame->nb_samples = 8000;
frame->format = AV_SAMPLE_FMT_S16;
frame->channels = 1;
frame->channel_layout = AV_CH_LAYOUT_MONO;
frame->sample_rate = 8000;
frame->quality = 1;
int res = avcodec_fill_audio_frame(frame, 1, AV_SAMPLE_FMT_S16, /*my samples data*/, 16000, 0);
// If res >= 0, continue with avcodec_encode_audio2
它的工作原理是:) ...好吧,我的意思是...
当我输入的是8000个音频样本( S16格式,即16000字节)时,它可以工作。 但是,当我有6000个音频样本(仍为S16格式,因此为12000字节)时,它失败并显示-22(无效参数)。 任何想法?
精度:此样本计数不会动态变化。 我的会话中的数据总是由8000个样本组成(并且有效),而其他会话中的数据总是由6000个样本组成(并且失败)。 样本数量和数据大小是这些会话之间唯一不同的参数。
编辑:如果我设置或不frame_size
现场AVCodecContext
,它返回到0后avcodec_open2
但选择μ律编码器具有AV_CODEC_CAP_VARIABLE_FRAME_SIZE
能力,所以它听起来正常。
每次对avcodec_encode_audio2()
调用的输入应恰好是N个样本,其中N是AVCodecContext::frame_size
。 在某些情况下,这取决于编解码器(例如,mp3帧大小是恒定的),但在其他情况下,它可以是可变的。 对于大多数编码器,它在编码中仍应保持恒定。 看起来您的值就是默认值,并且mulaw没有内置常量,因此您可以在调用avcodec_open2()
之前指定一个不同的frame_size
值,您应该可以。
如果样本数量动态变化,则需要一个环形缓冲区以确保avcodec_encode_audio2()
的输入仍具有恒定的样本数量。
好的,我解决了自己的问题,这是对齐问题。 有两种解决方法:
给输入缓冲区初始化并根据libavcodec
所需的默认对齐方式填充。 您可以使用av_samples_get_buffer_size
并将对齐值设置为0,以获取正确的大小。
在对齐参数为1的情况下调用avcodec_fill_audio_frame
以忽略对齐。
希望这会帮助别人:)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.