繁体   English   中英

为什么只有样本数不同时,avcodec_fill_audio_frame会返回-22?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM