由于FFmpeg的amerge滤镜导致的iOS中无法载入视频
Posted Jack_Chai
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了由于FFmpeg的amerge滤镜导致的iOS中无法载入视频相关的知识,希望对你有一定的参考价值。
本文出处:http://blog.csdn.net/chaijunkun/article/details/114550352,转载请注明。由于本人不定期会整理相关博文,会对相应内容作出完善。因此强烈建议在原始出处查看此文。
amerge引发的问题
一段视频,在合成后可能需要增加一段背景音乐来烘托气氛。然而在使用amerge进行混音时,如果不小心会出现问题。
例如将合成好的视频通过AirDrop发送到ios(因为这样无损),或者通过其他手段传送到移动设备时,可能会无法播放。
在iOS中可能会看到类似下面的提示:
如何复现
制作一段视频,其中的音频流一定要为单声道(mono);
准备一段背景音乐,一定要立体声(stereo);
使用ffmpeg进行音视频合成,即给上面的视频尝试增加一个背景音乐。滤镜方面使用amerge滤镜。
具体命令为:
ffmpeg -i video.mp4 -i bgm.mp3 -filter_complex "[0:a][1:a]amerge=imputs=2" issue.mp4
此时将输出的issue.mp4通过AirDrop发送到iOS上,这个问题必现(本例运行版本为:FFmpeg 4.3.1)。而video.mp4发送到iOS上可以正常播放。
分析原因
使用ffprobe查看video.mp4的音频流:
ffprobe -show_streams -of json video.mp4
其中注意音频流的流信息,尤其是声道数:
"channels": 1,
"channel_layout": "mono"
同样使用ffprobe查看背景音乐bgm.mp3的音频流:
ffprobe -show_streams -of json bgm.mp3
其中的音频流声道数为:
"channels": 2,
"channel_layout": "stereo"
再来看看合成后的视频issue.mp4的音频流:
ffprobe -show_streams -of json issue.mp4
其中的音频流声道数为:
"channels": 3,
"channel_layout": "3.0"
问题出现了,合成后的音频并没有像预期中那样,使用立体声或者单声道,而是变成了3声道。
iOS无法播放这样一个3声道的音频。
解决方法
把视频强制转换成立体声或者单声道就可以了。具体命令为:
ffmpeg -i issue.mp4 -c:v copy -ac 2 ok.mp4
注意:千万不要使用-c copy或者-c:a copy,这样会覆盖-ac强制声道选项。
当然,上面的情况只是一种。本质是视频格式不兼容。如果希望保留内容,解决办法都是建议重新转码。详细的mp4视频在iOS下的兼容情况,可以参阅:iOS流媒体指导FAQ
以上是关于由于FFmpeg的amerge滤镜导致的iOS中无法载入视频的主要内容,如果未能解决你的问题,请参考以下文章