我的问题解释得很快:我必须使用FFmpeg (原始PCM到G.711亩法律)编码音频样本。这是我的代码的错误部分(我在本例中将原始参数显式化):
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功能,因此听起来很正常。
发布于 2017-07-24 09:58:25
好吧,我解决了我自己的问题,这是一个对齐的问题。解决这一问题有两种方法:
libavcodec所需的默认对齐方式,初始化并填充输入缓冲区。您可以使用av_samples_get_buffer_size和对齐值来获得适当的大小。avcodec_fill_audio_frame以忽略对齐。希望这能对其他人有所帮助
发布于 2017-07-23 13:24:40
对avcodec_encode_audio2()的每个调用的输入应该正好是N个样本,其中N是AVCodecContext::frame_size。在某些情况下,这取决于编解码器(例如,mp3帧大小是恒定的),但在其他情况下,它可以是可变的。对于大多数编码器来说,它在编码中仍然应该是恒定的。看起来,您的值就是默认值,而mulaw没有内置常量,因此您可以在调用frame_size之前指定一个不同的avcodec_open2()值,应该可以。
如果样本数量动态变化,则需要一个环形缓冲区,以确保avcodec_encode_audio2()的输入仍然有固定数量的样本。
https://stackoverflow.com/questions/45241185
复制相似问题