记一次奇怪的音画不同步问题(ts转mp4)

一、缘起

最近在网上下载了一个 ts 格式的视频文件,帧率模式为可变帧率,使用播放器播放没有任何问题,传到 bilibili 后出现音画不同步的现象,具体表现为声音比画面快几秒。起初以为是 ts 格式和可变帧率的问题,以为转一下码就能解决。然而尝试了一番后发现问题并没有我想得那么简单...

二、使用ShanaEncoder 转码

我先是使用 ShanaEncoder 将文件转为 mp4,并把可变帧率改为固定帧率,转码完成后用播放器播放没有问题,传到B站后发现刚开始播放的时候是正常的,播放一分钟后就出现音画不同步的现象,暂停或拖动进度条后恢复正常。这实在是有点让人摸不着头脑。无奈之下,决定用火狐浏览器(之前一直是用chrome浏览器)试一下,发现居然播放正常!难道是浏览器的问题?

三、尝试关闭硬件加速

用 google 搜索了一番,果然有人反应 chrome 音画不同步的问题。有人说关闭浏览器的硬件加速可以解决问题。可我试了之后发现依然不行。期间我也试过播放其它视频,一切正常,说明不是浏览器的问题。

那为何火狐浏览器没有这个问题呢 ?我猜测可能是每个浏览器的处理机制不同,本地播放器和火狐浏览器都有对应的纠错功能,而 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

六、总结

起初以为是 ts 格式和可变帧率的问题,没曾想居然是时间戳的问题。最终我用 ShanaEncoder 复制视频流并加上 async 参数解决了问题,连转码都不用!

附:

音画不同步的视频文件:阿里云盘分享

感兴趣的小伙伴可拿去研究。

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值