一、缘起
最近在网上下载了一个 ts 格式的视频文件,使用播放器播放没有任何问题,传到 bilibili 后出现音画不同步的现象,具体表现为声音比画面快几秒。起初以为是 ts 格式的问题,于是决定转码试一下。然而问题并没有我想得那么简单...
二、使用ShanaEncoder 转码
使用 ShanaEncoder 将文件转为 mp4 后,用播放器播放没有问题,传到B站后发现刚开始播放的时候是正常的,播放一分钟后就出现音画不同步的现象,暂停或拖动进度条后恢复正常。这实在是有点让人摸不着头脑。无奈之下,决定用火狐浏览器(之前一直是用chrome浏览器)试一下,发现居然播放正常!难道是浏览器的问题?
三、尝试关闭硬件加速
用 google 搜索了一番,果然有人反应 chrome 音画不同步的问题。有人说关闭浏览器的硬件加速可以解决问题。可我试了之后发现依然不行。期间我也试过播放其它视频,一切正常,说明不是浏览器的问题。
为了找到问题,我又多次调整次编码参数,并传到B站测试效果,问题依旧(后来发现直接把视频拖到浏览器就可以测试了,不用上传)。
四、使用 handbreke 转码
多番折腾无果。决定试用 handbreke 试一下,这是一款开源的转码工具,多年之前我曾用它解决过音画不同步的问题,或许这一次也能解决。果然,用 handbreke 转码后播放正常,用 mediaInfo查看文件信息,发现总时长减少了5秒左右。于是明白了问题出在时间戳上。问题看似解决了,但我并不想止步于此。handbreke 虽然好用,但它的效率没有 ShanaEncoder 高,参数也没后者丰富。所以我还是要搞懂 handbreke 是怎么解决音画不同步的问题的。
五、问题解决
于是开始用 ffmpeg 时间戳 为关键词在 google 进行搜索,多方查找之后终于在一篇文章中找到了答案:
视频处理遇到的一些问题http://vicviz.com/h5-video-bo-fang-mp4yin-hua-bu-tong-bu/文中有一句关键的话:
在 ffmpeg 添加 -async 1 参数
抱着试试看的态度在 ShanaEncoder 中加入了这个参数。果然,问题解决!但与我想象中不同,总时长并未改变,看来handbreke 还做了一些其它操作,让时间也减少了。不过,这些都不重要了!
至此,困扰我两天的问题终于解决了!感谢前辈们留下的宝贵经验!
关于 async 参数的含义请查看这篇文章:Easily fix async video with ffmpeg | Lzone Blog
附:
音画不同步的视频链接:阿里云盘分享
有人想研究的话可以拿去研究。