FFmpeg 中视频被剪切并丢失帧

FFmpeg 中视频被剪切并丢失帧

我尝试了所有可能的命令来剪切 H.264 mp4 视频的一部分(1-3 分钟),但效果好坏参半。我的视频为 29.97 FPS、1080p、约 80 分钟、约 3.5 GB,比特率为约 6200 KB/s。问题是我的输出开始时没有视频 1-2 秒,然后继续正常,但音频从 0 秒开始。它在任何媒体播放器中播放同步良好(音频和视频),但在其他地方使用它(用于生产目的的渲染)时,例如在 Adob​​e AE、Media Encoder 或视频转换器中,最终渲染的视频从音频开始的 0 秒开始。因此,音频提前了 1-2 秒,我不想这样。在以下位置在线修剪 YouTube 视频时也会发生这种情况http://clipconverter.cc

我的命令如下:

ffmpeg -ss 01:19:22.000 -t 00:1:43.000 -i "in.mp4" -acodec copy -vcodec copy out.mp4

我甚至尝试将 -ss 放在 -i 后面,但得到的结果相同。另外,如果我已经有了有此问题的视频,我该怎么做才能修复它?我还可以在 Adob​​e AE 中对此做些什么?此网站:https://ubuntuforums.org/showthread.php?t=1824250说需要在“关键帧”处剪切。如果是这样,我该如何在 FFmpeg 中执行此操作?我如何找到它们?它们是什么?我永远不打算重新编码(使用 -c:v x264),因为它花费的时间太长,并且会重新压缩视频并产生伪影。

我使用过 FFmpeg 的静态和共享版本。还使用过稳定版 3.2.2 和 ffmpeg-20170112-6596b34-win64-static,但没成功。

TLDR:我在 FFMPEG 中剪切的视频在开头缺少帧(甚至没有黑帧或空白帧),导致最终在任何视频渲染软件中渲染时音频/视频不同步。

答案1

使用

ffmpeg -ss 01:19:22 -t 00:1:43 -i "in.mp4" -c copy -avoid_negative_ts make_zero out.mp4

大多数压缩视频都使用时间压缩,因此帧依赖于其他帧进行完全解码。如果您使用模式修剪视频copy,则入点之后的一些帧可能依赖于入点之前的帧进行解码。如果是这样,则必须包括这些帧。这些帧被分配了负时间戳,因此优秀的视频播放器会将它们用于解码而不是用于演示。视频从入点开始显示。由于所有音频帧都是关键帧,因此音频修剪非常精确,并且保留了 A/V 同步。

显然,视频编辑器似乎不关注 PTS,因此它们会显示文件中存储的所有帧。上面的命令强制所有存储帧都使用正 TS,因此视频/音频将保持同步*。

*不完全正确。对于基于 MDCT 的音频编解码器(如 MP3/AAC),前一帧包含负 PTS,因为它是解码所必需的。也许您的 NLE 会解码该帧,从而导致 21 - 23 毫秒的异步。解决方法是重新编码音频。

相关内容