我使用这个从 MP4 文件中剪切出一部分:
ffmpeg -i input.mp4 -vcodec copy -acodec copy -ss 00:36:18 -to 00:39:50 output.mp4
效果很好,但视频图像总是在开始时冻结 1 秒。
无论我尝试从哪个视频文件中剪切出一部分,视频都需要大约 1 秒钟才能开始。
下面是一个例子我所看到的。
答案1
问题可能是视频尝试仅基于关键帧而不是帧间帧进行剪切,并且您的初始时间00:36:18
比关键帧早几秒。解决方案应该是使用-copyinkf
选项手册中是这样描述的:
进行流复制时,也复制在开始时发现的非关键帧。
因此你的命令如下所示:
ffmpeg -i input.mp4 -vcodec copy -acodec copy -ss 00:36:18 -to 00:39:50 output.mp4
然后需要进行调整,使其看起来像这样并-copyinkf
混合到其中:
ffmpeg -i input.mp4 -vcodec copy -acodec copy -copyinkf -ss 00:36:18 -to 00:39:50 output.mp4
答案2
您正在复制的时间戳位于关键帧之间,如果复制帧间编解码器并且您的输入不是从关键帧开始,则使用 -vcodec copy 将始终导致这种行为。
您的选择是进行完整编码(即没有 -vcodec 复制)或选择不同的时间戳进行查找。您可以使用 ffprobe 找到所有关键帧的位置。
ffprobe -select_streams v -show_frames -print_format csv -show_entries frame=key_frame,pkt_dts_time input.mp4 | grep "frame,1"
第三列包含所有关键帧的时间戳(以秒为单位),您需要最接近但不晚于目标时间戳的时间戳。
答案3
我也遇到过这个问题,但我不知道为什么会发生这种情况以及如何解决它。只知道这个代码帮我解决了这个问题:
ffmpeg -ss 00:00:00 -to 00:00:10 -i input.mp4 -c:v copy -c:a copy output.mp4