![ffmpeg 将 mp4 文件分割成多个片段……第一个片段之后,音频不同步](https://linux22.com/image/1443592/ffmpeg%20%E5%B0%86%20mp4%20%E6%96%87%E4%BB%B6%E5%88%86%E5%89%B2%E6%88%90%E5%A4%9A%E4%B8%AA%E7%89%87%E6%AE%B5%E2%80%A6%E2%80%A6%E7%AC%AC%E4%B8%80%E4%B8%AA%E7%89%87%E6%AE%B5%E4%B9%8B%E5%90%8E%EF%BC%8C%E9%9F%B3%E9%A2%91%E4%B8%8D%E5%90%8C%E6%AD%A5.png)
注意:我错误地问了这个问题在 stackoverflow
我使用了 ffmpeg 命令行这个问题长期以来,完美分割 MKV 文件一直都是不可能的。现在我有一些 MP4 文件想要分割,一开始似乎可以分割,但第一个片段之后的每个后续片段的音频都不同步!而且差了好几秒钟。
我尝试强制关键帧(我在其他一些网站上找到的建议)但没有帮助。
我尝试了一个完全不同的程序 (Avidemux),它能够分割文件并输出正确的输出,但速度慢了很多,需要 3 分钟以上,而使用 ffmpeg 则不到 2 秒。使用 Avidemux,我能够确定我想要分割的 i 帧的准确位置,因此我想这可能是同步问题,于是我尝试了那个准确位置(即 00:12:17.111 而不是 00:12:16 或其他位置),但这也无济于事。
我是否缺少 ffmpeg 的某个选项,以便让它在分割时正确地将音频同步到视频?
请注意:我使用的是 2013 版 ffmpeg。我刚刚将其更新到最新的 2.6 版,但问题仍然存在。
答案1
根据文档,-ss 标志根据其在命令中的位置执行不同的操作
-ss 位置(输入/输出)用作输入选项时(在 -i 之前),在此输入文件中搜索位置。请注意,在大多数格式中,无法精确搜索,因此 ffmpeg 将搜索位置之前最近的搜索点。当启用转码和 -accurate_seek(默认)时,搜索点和位置之间的这个额外段将被解码并丢弃。在进行流复制或使用 -noaccurate_seek 时,它将被保留。
当用作输出选项(在输出文件名之前)时,解码但丢弃输入,直到时间戳到达位置。
位置可以以秒为单位,也可以以 hh:mm:ss[.xxx] 格式表示。
因此,从您自己的答案来看,第一个命令将逻辑应用于输出,第二个命令将其应用于输入
答案2
我不确定我是否理解为什么,但问题在于参数的顺序。
在链接的示例中,命令如下:
ffmpeg -i input.avi -vcodec copy -acodec copy -ss 00:30:00 -t 00:30:00 output2.avi
当然,我使用的是 mp4 而不是 avi,但除此之外,我输入的命令与上面的完全相同,并且(使用 mp4)我得到的音频结果不同步。我无意中发现了这个“修复”...如果我改为这样输入命令:
ffmpeg -ss 00:30:00 -i input.mp4 -vcoded copy -acodec copy -t 00:30:00 output2.mp4
我没有遇到同步问题。为什么?不知道。但它有效。我试了几次来确认……仅更改参数顺序即可解决问题。