解决avcodec_encode_audio2()返回-22的问题

2:使用2012.8.31日编译的库  编码mp3

avcodec_decode_audio4();

avcodec_encode_audio2();


调用上面两个函数出现的问题是:当某些解码器对AVCodec:frame_size填充时,不同解码器在解码时设定的frame_size 和AVFrame::nb_samples过大,从而导致在编码的时出错。对于MP3编码器来说,该编码器最大能支持1152(该值可以再源码中lsf     = sample_rate < (24000+32000)/2和该函数mp_decode_frame中得到,该函数位于libavcodec/mpegaudiodec)的帧数(这里的帧数实际就是样本大小,但不是采样大小,只是AVframe里面的样本数)


解决方法:将解码得到的AVFrame  进行分拆,将其nb_samples分拆成当前编码器能支持最大的frame_size或小于frame_size的大小,

分拆时要依据当前AVFrame::nb_samples的大小,该值与解压后的数据大小是这样的关系AVFrame::linesize[0] = AVFrame::nb_samples*2*AVCodecContext::channals;(该2表示每样本的字节数:16/8),根据这个关系,我们此时可以将AVFrame::data[0] 的数据分拆成若干个AVFrame, 分拆后新的AVFrmae除了linesize,data,nb_sampels 改变,其余不用改,用原来AVFrame的值,赋予新的AVFrame的结构变量

转载于:https://my.oschina.net/u/589963/blog/168033

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用 `av_interleaved_write_frame` 来将 AAC 音频写入文件,需要执行以下步骤: 1. 打开输出文件并为其分配 AVFormatContext。 ```c++ AVFormatContext *outFormatCtx = nullptr; avformat_alloc_output_context2(&outFormatCtx, nullptr, nullptr, outputFileName); ``` 2. 添加音频流并为其分配 AVCodecContext。 ```c++ AVStream *audioStream = avformat_new_stream(outFormatCtx, nullptr); AVCodecContext *audioCodecCtx = audioStream->codec; ``` 3. 设置音频编码参数。 ```c++ audioCodecCtx->codec_id = AV_CODEC_ID_AAC; audioCodecCtx->codec_type = AVMEDIA_TYPE_AUDIO; audioCodecCtx->sample_fmt = AV_SAMPLE_FMT_FLTP; audioCodecCtx->sample_rate = 44100; audioCodecCtx->channel_layout = AV_CH_LAYOUT_STEREO; audioCodecCtx->channels = av_get_channel_layout_nb_channels(audioCodecCtx->channel_layout); audioCodecCtx->bit_rate = 128000; ``` 4. 打开音频编码器并将其参数传递给编码器。 ```c++ AVCodec *audioCodec = avcodec_find_encoder(audioCodecCtx->codec_id); avcodec_open2(audioCodecCtx, audioCodec, nullptr); ``` 5. 写入文件头。 ```c++ avformat_write_header(outFormatCtx, nullptr); ``` 6. 准备音频帧和输出包,然后将音频帧编码为输出包。 ```c++ AVFrame *audioFrame = av_frame_alloc(); AVPacket *audioPacket = av_packet_alloc(); // 将音频数据写入音频帧 // ... // 编码音频帧 avcodec_send_frame(audioCodecCtx, audioFrame); while (avcodec_receive_packet(audioCodecCtx, audioPacket) == 0) { // 将输出包写入文件 av_interleaved_write_frame(outFormatCtx, audioPacket); } ``` 7. 写入文件尾。 ```c++ av_write_trailer(outFormatCtx); ``` 完整的代码示例可以参考 FFmpeg 官方文档:https://ffmpeg.org/doxygen/trunk/doc/examples/encode_audio.c.html

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值