我有一个面向教育工作者的程序(使用
electronjs
框架编写),可以播放视频,跳到视频中的预设点(如配套 JSON 文件中定义)。有时,跳过后会出现明显的滞后,这个答案表明存在滞后是因为关键帧不频繁。
假设这是正确的,我想在 mp4 文件中我知道播放器将跳到的确切位置插入关键帧。然而,其中一些视频文件已经相当大,所以我不想减少关键帧间隔,从而使文件变得更大。我只需要在整个文件中强制使用少数关键帧。
我希望能够在我想要强制关键帧的时间传递一个参数(例如,到
ffmpeg
)。最好,我想在不重新编码整个视频的情况下执行此操作(就像这个未回答的问题),但如果我必须重新编码视频,我也可以这样做。
您可以使用 ffmpeg 使用
-force_key_frames
选项在您想要的位置插入关键帧。
例如:
./ffmpeg -i input.mp4 -c:a copy -vcodec libx264 -force_key_frames 0:05:00,0:10:00 out.mp4
将把关键帧尽可能靠近 5 和 10 标记。时间值可以采用 hh:mm:ss 格式,也可以仅采用秒(单个值,无冒号)。
您可以使用以下方法检查是否有框架插入到您想要的位置:
./ffprobe -select_streams v:0 -skip_frame nokey -show_entries frame=pkt_pts_time out.mp4