如何使用 FFMPEG 找到 -SS 的“安全”点以避免破坏 A/V 同步?

Esl*_*ake 7 audio ffmpeg

我需要找到一种使用 -SS 剪切视频而不破坏音频/视频同步的方法。

有时它工作得很好,但大多数时候音频会稍微不同步。显然有类似于音频关键帧的东西,但我不知道如何找到它们。

当将 -SS 与编解码器的任何规范(包括 -c copy)结合使用时,会出现此问题。

就我的目的而言,我不能失去质量,所以这些是必要的。

ffmpeg -i src.mp4 -ss 1:00 -t 30 -c copy result.mp4
Run Code Online (Sandbox Code Playgroud)

往往会破坏同步。

ffmpeg -i src.mpr -ss 1:00 -t 30 result.mp4
Run Code Online (Sandbox Code Playgroud)

生成匹配的 a/v,但使用默认压缩会造成显着的质量损失。

我需要一种方法来找到剪辑会导致匹配 a/v 的时间。

Bra*_*rad 4

该问题实际上与视频关键帧有关。音频/视频在 MP4 输出中的不同时间有效启动。

无论如何,我发现使用 Matroska 进行输出效果很好,因为它似乎比 MP4 更好地支持这些不同的时间戳。

无论如何,您可能会发现此讨论很有帮助: https ://github.com/mifi/lossless-cut/pull/13

以下是可能适合您的相关 FFmpeg 命令。请试一试!

ffmpeg -ss 1:00 -i src.mp4 -t 30 -avoid_negative_ts make_zero -c copy result.mp4
Run Code Online (Sandbox Code Playgroud)

这里的关键是avoid_negative_ts,我相信它允许将先前的 GOP 输出到文件中,但将它们的时间戳设置为全部发生在零(当然,直到它们不应该发生),这样它们就可以用于解码,从而允许您任意剪切文件而不转码。