【发布时间】:2018-08-23 22:48:19
【问题描述】:
我有一个面向教育工作者的程序(使用 electronjs 框架编写)播放视频,跳到视频中的预设点,如配套 JSON 文件中定义的那样。有时跳过后会出现明显的延迟,this answer 表明存在延迟是因为关键帧不常见。
假设这是正确的,我想在我知道播放器将跳到的 mp4 文件中的确切点插入关键帧。但是,其中一些视频文件已经很大,所以我不想减少关键帧间隔,从而使文件变得更大。我只需要强制整个文件中的几个关键帧。
我希望能够传递一个参数(例如,ffmpeg)以及我想要强制关键帧的时间。最好不要重新编码整个视频(就像this unanswered question),但如果我必须重新编码视频,我也可以这样做。
【问题讨论】:
-
你看过 -force_key_frames 选项吗?例如
ffmpeg -i input.mp4 -force_key_frames 0:05:00,0:10:00 out.mp4... 这将使关键帧尽可能接近 5 和 10 秒标记 -
理论上,这可以在不重新编码整个视频的情况下完成 - 基本思想是将源流分段为每段一个 GOP。将违规片段重新编码为与源相同的比特流参数,然后使用 concat demuxer 重新拼接。
-
@Offbeatmammal 您的示例和文档都使用
HH:MM:SS格式的时间。时间可以用秒来表示吗? (例如7200.132而不是2:00:00.132) -
如果您只提供一个数字(没有冒号),它看起来确实会恢复为秒。检查是否在您想要的位置插入了框架的快速方法是
/ffprobe -select_streams v:0 -skip_frame nokey -show_entries frame=pkt_pts_time out.mp4
标签: video ffmpeg html5-video