我正在尝试根据我输入到 ffmpeg 的一组帧范围来分割较大的视频。关于 -f 段 -segment_frames 选项以及预期/生成的内容,有一些问题。以下是我正在运行的内容:
ffmpeg -i full_movie.mov -f segment -segment_frames 123 -reset_timestamps 1 -c:a copy -map 0 "/Users/sjan/Desktop/%03d_test.mov"
ffmpeg -i full_movie.mov -f segment -segment_frames 124, 163 -reset_timestamps 1 -c:a copy -map 0 "/Users/sjan/Desktop/%03d_test.mov"
第一个 ffmpeg 命令是从 0 到 123 还是从 1 到 123?
考虑到在 QT 中打开此影片时从 0 开始,带有 -segment_frames 选项的 ffmpeg 在读取 QT 影片时是否从 0 开始?如果它从 0 开始,我是否应该期望通过减去 1 来输入我的帧范围来解决这个问题?我在适当的范围内看到不一致的结果,很可能是由于这个原因。
答案1
是的,segment_frames 从 0 开始。根据经验,ffmpeg 中的几乎所有索引计数器都从 0 开始。
因此,-segment_times 124,163
告诉 ffmpeg 为帧 0-123、124-162 和 163-END 分别创建一个片段。但是,如果这些起始帧不是关键帧,ffmpeg 将使用在这些帧之后找到的第一个关键帧开始片段。
添加-break_non_keyframes 1
以强制对指定帧进行分段。但是,如果片段是独立播放的,则初始帧可能无法正确解码,直到找到关键帧。由于您正在编码视频,因此您可以通过添加来强制在分段点处设置关键帧-force_key_frames expr:eq(n\,124)+eq(n\,163)