首页 > 其他分享 >由于FFmpeg的amerge滤镜导致的iOS中无法载入视频

由于FFmpeg的amerge滤镜导致的iOS中无法载入视频

时间:2022-10-19 12:03:39浏览次数:70  
标签:视频 FFmpeg 音频 iOS amerge ffprobe mp4 issue


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强制声道选项。

当然,上面的情况只是一种。本质是视频格式不兼容。如果希望保留内容,解决办法都是建议重新转码。详细的mp4视频在iOS下的兼容情况,可以参阅:​​iOS流媒体指导FAQ​



标签:视频,FFmpeg,音频,iOS,amerge,ffprobe,mp4,issue
From: https://blog.51cto.com/u_3932467/5769530

相关文章

  • 从FFmpeg输出日志中分析问题原因——记一次输出流顺序异常
    输出流的顺序怎么无法改变一个视频文件,常规地,会将视频流放在第一个位置,其次将音频流放到第二个位置。对于一些特殊的视频,想要改变其顺序,也是非常方便的,直接使用FFmpeg提供的......
  • FFmpeg中使用loop输入流与shortest参数后,音视频流时长被改变
    问题来自于制作视频水印需求给一段视频加上一张静态图片制作的logo,在网上已经有很多例子了,只要把它放置在视频的固定位置即可,这个功能非常容易实现:ffmpeg-ivideo.mp4-il......
  • 我的Vue之旅 07 Axios + Golang + Sqlite3 实现简单评论机制
    第三期·使用Vue3.1+TailWind.CSS+Axios+Golang+Sqlite3实现简单评论机制效果图CommentArea.vue我们需要借助js的Data对象把毫秒时间戳转化成UTCStrin......
  • vue之axios
    什么是axios?Axios是一个基于promise的HTTP库,可以用在浏览器和node.js中。特性1从浏览器中创建XMLHttpRequests2从node.js创建http请求3支持PromiseAPI4......
  • 我的Vue之旅 07 Axios + Golang + Sqlite3 实现简单评论机制
    第三期·使用Vue3.1+Axios+Golang+Sqlite3实现简单评论机制效果图CommentArea.vue我们需要借助js的Data对象把毫秒时间戳转化成UTCString()。并在模板......
  • 解决ios设备软键盘弹出导致页面整体被顶起
    问题ios设备:点击input,软键盘弹出,页面整体向上偏移需求当软键盘弹起,input改变位置并始终贴着软键盘,整体页面不上移动解决页面采用flex布局<divclass="flex"><d......
  • mui组件导致ios设备无法让input获取焦点
    问题页面使用了mui组件,其中有个input标签。在IOS,macOS设备上无法通过点击让input框获得焦点,导致无法输入。原因mui.css中有个样式,让页面内容无法被选中,影响了input获取......
  • iOS Block
    http://events.jianshu.io/p/94db362acb97  Block的分类Block有三种类型:全局Block,堆区Block,栈区Block全局Block当Block没有引用到局部变量时或者Block里面使用的......
  • FFmpeg:FIFO + PIPE
    FIFO将某些内容流式传输到stdout管道,即使在临时故障(网络中断)的情况下也继续以实时速率处理流,并尝试无限期地每秒恢复流式传输。ffmpeg-re-stream_loop-1-ihttps://f......
  • axios : Promise based HTTP client for the browser and node.js
    axiosPromisebasedHTTPclientforthebrowserandnode.jsFeaturesMake​​XMLHttpRequests​​fromthebrowserMake​​http​​requestsfromnode.jsSupportsthe......