首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么avcodec_fill_audio_frame返回-22当只有样本计数是不同的?

为什么avcodec_fill_audio_frame返回-22当只有样本计数是不同的?
EN

Stack Overflow用户
提问于 2017-07-21 15:15:37
回答 2查看 942关注 0票数 1

我的问题解释得很快:我必须使用FFmpeg (原始PCM到G.711亩法律)编码音频样本。这是我的代码的错误部分(我在本例中将原始参数显式化):

代码语言:javascript
复制
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个样本组成(并且失败)。样本计数和数据大小是这些会话之间唯一不相同的参数。

编辑:,如果我在AVCodecContext中设置了frame_size字段,它在avcodec_open2之后返回到0,但是所选的mu-law编码器具有AV_CODEC_CAP_VARIABLE_FRAME_SIZE功能,因此听起来很正常。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-24 09:58:25

好吧,我解决了我自己的问题,这是一个对齐的问题。解决这一问题有两种方法:

  • 根据libavcodec所需的默认对齐方式,初始化并填充输入缓冲区。您可以使用av_samples_get_buffer_size和对齐值来获得适当的大小。
  • 使用对齐参数1调用avcodec_fill_audio_frame以忽略对齐。

希望这能对其他人有所帮助

票数 1
EN

Stack Overflow用户

发布于 2017-07-23 13:24:40

avcodec_encode_audio2()的每个调用的输入应该正好是N个样本,其中N是AVCodecContext::frame_size。在某些情况下,这取决于编解码器(例如,mp3帧大小是恒定的),但在其他情况下,它可以是可变的。对于大多数编码器来说,它在编码中仍然应该是恒定的。看起来,您的值就是默认值,而mulaw没有内置常量,因此您可以在调用frame_size之前指定一个不同的avcodec_open2()值,应该可以。

如果样本数量动态变化,则需要一个环形缓冲区,以确保avcodec_encode_audio2()的输入仍然有固定数量的样本。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45241185

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档