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