解决FFmmpeg合成的MP4文件播放没声音

目录

前言

一、问题是什么?

二、进行测试

1.测试ffmpeg.exe

2.测试MP4文件

3.发现问题

三、解决问题

找到一个Tanscoding的代码 



前言

之前使用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版本比较老或者有什么其他原因吧,在我用的版本代码中测试到会有和这个现象。

上一篇:使用Vscode调试vue代码


下一篇:2021-06-07