ffmpeg 将 mp4 文件分割成多个片段……第一个片段之后,音频不同步

ffmpeg 将 mp4 文件分割成多个片段……第一个片段之后,音频不同步

注意:我错误地问了这个问题在 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

我没有遇到同步问题。为什么?不知道。但它有效。我试了几次来确认……仅更改参数顺序即可解决问题。

相关内容