Audio 如何找到一个;“安全”;使用FFMPEG避免中断A/V同步的点为-SS?

Audio 如何找到一个;“安全”;使用FFMPEG避免中断A/V同步的点为-SS?,audio,ffmpeg,Audio,Ffmpeg,我需要找到一种在不破坏音频/视频同步的情况下使用-SS剪切视频的方法 偶尔它工作得非常好,但大多数时候音频会稍微不同步。显然,有一些东西类似于音频的关键帧,但我不知道如何找到它们 当将-SS与任何编解码器规范(包括-c copy)结合使用时,就会出现问题 就我的目的而言,我不能失去质量,所以这些是必要的 ffmpeg -i src.mp4 -ss 1:00 -t 30 -c copy result.mp4 倾向于打破同步 ffmpeg -i src.mpr -ss 1:00 -t 30 res

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

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

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

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

ffmpeg -i src.mp4 -ss 1:00 -t 30 -c copy result.mp4
倾向于打破同步

ffmpeg -i src.mpr -ss 1:00 -t 30 result.mp4
生成匹配的a/v,但由于使用默认压缩而导致严重的质量损失


我需要一种方法来找到切割将导致匹配a/v的时间。

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

值得一提的是,我发现将Matroska用于输出效果很好,因为它似乎比MP4更好地支持这些不同的时间戳

在任何情况下,您可能会发现此讨论很有帮助:

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

ffmpeg -ss 1:00 -i src.mp4 -t 30 -avoid_negative_ts make_zero -c copy result.mp4

这里的关键是
避免负的\u ts
,我相信这允许将前一个GOP输出到文件中,但是将它们的时间戳设置为全部发生在零(当然,直到它们不应该发生为止),这样它们就可以用于解码,允许您在不进行转码的情况下任意剪切文件。

Matroska muxer不允许负时间戳,因此ffmpeg所做的是使用ts 0将所有数据包写入指定的剪切点。回放时,将显示第一帧,然后删除所有帧,直到遇到第一个非冲突时间戳,即切点。MP4具有编辑列表,因此可以清晰地跳过截止点之前的所有帧进行演示。这依赖于消费者能够处理编辑列表。很少有玩家不这样做,我想编辑们也不这样做。@Gyan谢谢你的澄清。因此,Matroska muxer实际上是在自己做
-避免负的\u ts make \u zero
?我还没有检查,但我怀疑是库框架作用于muxer中负的ts标志的存在/不存在。