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強制聲道選項。