抬头仰望星空,是否能发现自己的渺小。

伪斜杠青年

人们总是混淆了欲望和理想

小视频分享至微信无法播放的问题

背景

业务需求,需要对视频贴图,然后进行分享到微信等平台。

问题现象

原视频无问题,所有设备与平台均能直接播放,格式为普通的 h.264 mp4,经过处理后的视频在电脑手机均可播放,手机 QQ 也可播放,但在微信无法播放。

通过 log 观察得知,微信一直报错:

aac decoder returned error 0x4004 substituting silence

这就让人很为难了,毕竟我也不是ffmpeg 的高手,but,我好像认识一个高手。

高手和我说:“我遇到问题都是直接改 ffmpeg 的源码,你这种我也没遇到过”,不过,我将现象描述给他后,他给了我一些建议。

主要原因

先摸清楚主要的处理逻辑:音视频分离 -> 贴图与视频合并 -> 合并完的视频再与音频合并。

经过反复的尝试,以及观察项目中使用的 ffmpeg 命令。分析出大概的问题就在于 demux(音视频分离) 时分离出来的音频出了问题。

打印各种命令:

ffmpeg, -i, bg.jpg, -i, video_file.mp4, -i, cover.jpg, -filter_complex, [1:v]scale=-1:1920,crop=1080:1920:0:0[inner1];[0][inner1]overlay=0:0[tmp1];[tmp1][2]overlay=0:0, -c:v, libx264, -x264-params, profile=extended:level=3.0, -crf 31, -preset, ultrafast, -threads, 0, -t, 8.521, -an, -y, video_file.mp4

ffmpeg, -i, video_file.mp4, -filter_complex, [0:a]concat=n=1:v=0:a=1[out], -map, [out], -c:v, libx264, -preset, ultrafast, -t, 8.521, -y, audio.aac]

麻溜的一大串,最后查到 -an 是主要的分离参数,尝试将其去除,果不其然,贴图的视频分享出去没什么问题了。

至于为什么微信播不了,其它可以播,这个不在我的考虑之内,网上原因也很多,主要是说 aac 有个什么文件头无法被识别,在按别人的说法进行过滤尝试后发现并不是这样,于是也就不贴地址了。同时,这其实应该是微信需要修的 bug。

解决办法

以前要音视频分离的原因是要做多个视频的合并,所以才有那么一个逻辑,而对于单个视频的贴图,直接贴就好,所以说我是规避掉了,而不是解决掉了。

这里按朋友的意思其实还有几种分离的方式,未去验证,先放这儿。

ffmpeg -i test.mp4 -vcodec copy -vbsf h264_mp4toannexb -an test.h264
ffmpeg -i test.mp4 -acodec copy -vn test.aac
ffmpeg -i test.h264 -i test.aac -vcodec copy -acodec copy -absf aac_adtstoasc test_1.mp4

这些情况分离出来的音频会不会有问题就不知道了,我也没碰过这些不熟。

同时也可以通过更换或者提升 ffmpeg 的版本等方式看看问题是否存在。

其他

日常水一篇,之前在遇到这个问题的时候,我想,我也没碰过 ffmpeg 文档也没看过,这个咋解呢,要不要直接给老大呢?想了想,没碰过就碰一下,反正也是 sdk,只是 api 的调用,最后虽然只是规避,但也是满足需求了,同时自己多多少少还是了解了一些东西。

如果前期有学习过 ffmpeg 估计会更好一点,既然迟早会遇到,学一学也没什么,列入 TODO,不过,哪年 TODO 就不知道了


0条评论

发表评论