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

博主在上传ts格式的可变帧率视频到B站后遇到音画不同步问题。经过尝试,发现ShanaEncoder转码并添加ffmpeg的async参数能解决,但效率不如handbreke。最终通过深入研究ffmpeg时间戳参数,成功在ShanaEncoder中加入async参数修复问题,无需转码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、缘起

最近在网上下载了一个 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 参数解决了问题,连转码都不用!

附:

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

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

<think>好的,我需要帮助用户解决TSMP4时因时间戳问题导致的音画不同问题。首先,我得回忆一下之前看到的相关引用内容。用户提到使用ffmpeg的-shortest选项来截取音视频较长的一段,这可能和同有关[^1]。另外,用户之前遇到的可变帧率问题导致上传后不同码尝试未果,说明可能需要处理时间戳或调整音视频同[^2]。 接下来,我应该分骤考虑解决方案。首先,检查时间戳是否正确。使用ffmpeg分析文件信息,比如用`ffprobe`查看详细的时间戳和帧率信息。然后,可能需要对音频和视频进行重新同。用户提到的-shortest选项可能是在拼接时使用,但这里的问题可能出在时间戳本身,所以需要修复时间戳。 另外,可变帧率(VFR)可能导致问题成恒定帧率(CFR)可能有效。使用ffmpeg的`-vsync`参数或者`fps`滤镜来固定帧率。例如,强制设置为30fps。同时,可能需要重新编码音频和视频流,确保它们的PTS连续。 用户可能还需要调整音频延迟,或者使用`asetpts`和`setpts`滤镜来手动调整时间戳。如果问题码后依然存在,可能需要检查容器格式,确保MP4支持相关编码参数,或者尝试不同的封装格式。 总结可能的骤:检查时间戳信息,修复时间戳,换帧率为恒定,重新编码时同音视频,使用正确的ffmpeg参数。需要将这些骤详细解释,并给出具体的命令示例,方便用户操作。同时,注意引用之前提到的解决方案,如使用-shortest选项可能相关,但需要结合当前问题调整。</think>### TSMP4音画解决方案 #### 1. 检查时间戳和帧率模式 首先使用`ffprobe`分析视频元数据: ```bash ffprobe -show_streams input.ts ``` 检查`time_base`(时间基)和`r_frame_rate`(帧率)字段。可变帧率(VFR)视频会显示`avg_frame_rate``r_frame_rate`不一致[^2]。 #### 2. 强制时间戳连续化 使用`ffmpeg`重置时间戳: ```bash ffmpeg -i input.ts -vf "setpts=PTS-STARTPTS" -af "asetpts=PTS-STARTPTS" -fflags +genpts output.mp4 ``` - `setpts/asetpts`:重置视频/音频时间戳为从0开始连续计数 - `-fflags +genpts`:强制生成新的PTS时间戳 #### 3. 换可变帧率为恒定帧率 ```bash ffmpeg -i input.ts -vsync cfr -r 30 -c:v libx264 -c:a aac output.mp4 ``` - `-vsync cfr`:强制恒定帧率模式 - `-r 30`:设置目标帧率为30fps(可根据实际需求调整) #### 4. 音视频流同修正 当出现固定偏移时(如音频始终快2秒): ```bash ffmpeg -i input.ts -itsoffset 2.0 -i input.ts -map 0:v -map 1:a -c copy output.mp4 ``` - `-itsoffset 2.0`:将第二个输入流(音频)延迟2秒 - `-map 0:v -map 1:a`:取第一个文件的视频和第二个文件的音频 #### 5. 使用中间格式码 对于复杂的时间戳问题: ```bash ffmpeg -i input.ts -c:v prores -profile:v 3 -c:a pcm_s16le intermediate.mov ffmpeg -i intermediate.mov -c:v libx264 -c:a aac final.mp4 ``` 通过中间格式(如ProRes)重置所有时间戳信息。 ### 验证工具推荐 1. **Mediainfo**:检查输出文件的帧率模式和时长 2. **Audacity**:导入视频文件查看音画波形对齐情况 3. **MPV播放器**:按`\`键显示精确到帧的时间戳信息 ### 常见问题排查表 | 现象 | 可能原因 | 解决方案 | |-------|---------|---------| | 音频逐渐偏移 | 采样率不匹配 | 统一音频采样率为44100Hz | | 随机时间跳跃 | 错误时间戳 | 使用`setpts`重置时间戳 | | 开头同但逐渐不同 | 帧率不稳定 | 换为恒定帧率 | | 特定段落不同 | 文件拼接问题 | 添加`-shortest`参数[^1] |
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值