目录
前言
之前使用FFmpeg库合成H264文件和aac文件为MP4文件,最近发现了一个问题
一、问题是什么?
把合成的Mp4文件上传到网页客户端,发现后台用ffmpeg.exe程序升高音量后的文件,直接音量没有了,但是原文件使用播放器播放的时候视频音频正常,这就有点奇怪了。
二、进行测试
1.测试ffmpeg.exe
用另外的MP4文件进行音量处理,没有影响声音,那ffmpeg.exe应该是没啥问题的
2.测试MP4文件
把MP4文件下载到一台普通安卓机里面,发现也是没有声音的,所以这里就要怀疑一下MP4文件格式是否有问题了
3.发现问题
既然Mp4文件存在问题,联想到了合成MP4的时候遇到了一个提示
[AVBSFContext @ 0x2baf00] Codec 'h264' (28) is not supported by the bitstream filter 'aac_adtstoasc'. Supported codecs are: aac (86018)
这里说和H264不支持比特流过滤器 aac_adtstoasc,支持的编解码器有:aac,所以合成的时候选择的声音格式不对
三、解决问题
没办法,只能再找资料,看看是哪里的问题,
一开始先怀疑是不是版本有问题,因为很多代码是参考的雷神之前的视音频复用器(muxer)的代码,可能是和雷神用的库版本不一样,试了两个不同的版本,还是有这句提示,而且程序还会到最后的时候挂掉
然后修改 bitstream_filter有关的代码
AVBitStreamFilterContext* aacbsfc = av_bitstream_filter_init("aac_adtstoasc");
av_bitstream_filter_filter(aacbsfc, out_stream->codec, NULL, &pkt.data, &pkt.size, pkt.data, pkt.size, 0);
av_bitstream_filter_close(aacbsfc);
因为运行的时候有提示这几个函数过时了,要使用新的API接口,我测试了新的接口,编译通过就是最后合成的时候有一大堆错误,哎,难啊
然后就去网上找有没有muxing的代码参考,发现很少示例是muxing的,其他demux,decode的倒是不少,
找到一个Tanscoding的代码
他是读取视频文件Sample.mkv,解复用抽取音视流,分别编码为HEVC/H.265视频流和OGG音频流,并封装为Sample.ts,他这里也会用到把视频流和音频流再合起来,但是没有用到了bitstream_filter相关的函数,
我突发奇想,我也把相关的代码去掉看看,去掉之后,居然能正常合成文件,然后测试音量拉高也是可以的,困扰许久的问题就这样解决了。。。,可能雷神用的FFmepg版本比较老或者有什么其他原因吧,在我用的版本代码中测试到会有和这个现象。