由于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中无法载入视频的主要内容,如果未能解决你的问题,请参考以下文章

FFmpeg流拼接滤镜concat原理与使用注意事项

FFmpeg中转场滤镜xfade的时间参数(duration和offset)与算法解读

如何在ffmpeg中使用滤镜技术

如何在ffmpeg中使用滤镜技术

FFmpeg滤镜(1)

FFmpeg中剪裁crop绘制文字drawtext叠加overlay滤镜在关于x坐标计算时的问题