gpt4 book ai didi

c++ - 为什么只有样本计数不同时 avcodec_fill_audio_frame 返回 -22?

转载 作者:行者123 更新时间:2023-11-30 01:39:37 25 4
gpt4 key购买 nike

我的问题解释起来非常快:我必须使用 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(无效参数)。有什么想法吗?

PRECISION:此样本计数不会动态变化。我的数据 session 总是由 8000 个样本组成(并且有效),而其他 session 的数据总是由 6000 个样本组成(并且失败)。样本数和数据大小是这些 session 之间唯一不同的参数。

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

最佳答案

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

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

关于c++ - 为什么只有样本计数不同时 avcodec_fill_audio_frame 返回 -22?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45241185/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com