天天看點

由于FFmpeg的amerge濾鏡導緻的iOS中無法載入視訊

amerge引發的問題

一段視訊,在合成後可能需要增加一段背景音樂來烘托氣氛。然而在使用amerge進行混音時,如果不小心會出現問題。

例如将合成好的視訊通過AirDrop發送到iOS(因為這樣無損),或者通過其他手段傳送到移動裝置時,可能會無法播放。

在iOS中可能會看到類似下面的提示:

由于FFmpeg的amerge濾鏡導緻的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強制聲道選項。