当用户寻找另一个时间时,计算 HTML5 视频流中的 .m4s 段文件后缀

Posted

技术标签:

【中文标题】当用户寻找另一个时间时,计算 HTML5 视频流中的 .m4s 段文件后缀【英文标题】:Calculate .m4s segment file suffix in HTML5 video streaming when user seeks to another time 【发布时间】:2016-07-06 20:06:58 【问题描述】:

我使用 Mp4Box 为长 MP4 视频创建了固定长度的片段。 Mp4Box 创建一个元信息文件mv_init.mp4 和像mv_1.m4smv_2.m4s 等片段...我使用html5 媒体源扩展流式传输视频并且流式传输工作正常。

问题是我无法使用我的 HTML5 播放器的时间搜索功能。当用户使用搜索栏寻找另一个时间点时,我需要为该currentTime 获取正确的段文件(mv_number.m4s)。

例如:

视频时长:2 小时 段大小:10 秒 用户寻求时间:25 分钟

25 分钟 = 25 × 60 秒 = 1500 秒。由于每个段为 10 秒,我需要段号 1500 / 10 = 150。所需的段文件是 mv_150.m4s

计算似乎正确,但 HTML5 播放器随后在继续流式传输之前在mv_150.m4s 之后下载更多文件

如何正确计算segment文件数,让查找后流式传输流畅,无需下载额外文件?

为了创建 MP4 视频的片段,我使用了以下命令:

MP4Box -dash 10000 -out video.mpd -dash-profile live -segment-name mv_ -rap video.mp4

【问题讨论】:

你是播放器的作者吗?你能包括一个minimal reproducible example吗? IE。一个演示问题的最小示例。你用什么浏览器? 【参考方案1】:

我已经对此事进行了研究,并找到了真正的原因。加载段的计算是正确的。问题在于视频文件中的关键帧间隔。关键帧是视频中的一个帧,视频随后可以从该帧加载并从该点运行。所以在我的情况下,我需要在每个片段的开头插入关键帧。因此,当我们在不同时间位置搜索视频时,加载的下一个片段在其开头包含一个关键帧。

视频文件中的关键帧可以使用 FFMPEG 设置。因此,例如,如果我们有一段 5 秒的视频,那么我们必须使用 ffmpeg 以 5 秒的间隔创建关键帧。设置关键帧时的另一个重点是查看视频的帧率。视频必须有一个固定的帧率,这样我们才能精确地计算出关键帧的位置。

示例:

Video File: gladiator.mp4

Segment Size: 5 seconds

不,我们使用 FFMPEG 设置帧速率和关键帧间隔

ffmpeg -i 角斗士.mp4 -x264-params keyint=120:min-keyint=120:no-scenecut=1 -r 24 角斗士-output.mp4

keyint=120 i.e; 24 fps * 5 seconds = 120

现在我们使用 Mp4Box 创建片段文件

MP4Box -dash 5000 -frag 5000 -outgladiator.mpd -dash-profile 按需-segment-name mv_gladiator-output.mp4

所以它会创建像 mv_1,mv_2, .. 这样的片段,在每个片段文件的开头都有关键帧。

Seekable Dash Streaming Example

【讨论】:

以上是关于当用户寻找另一个时间时,计算 HTML5 视频流中的 .m4s 段文件后缀的主要内容,如果未能解决你的问题,请参考以下文章

加载 HTML5 视频时如何制作加载图像?

如何在html5中自动播放视频

html5 播放事件与视频标签中的播放事件

加载另一个源时 HTML5 视频大小发生变化

HTML5 视频 - 在 Android 设备上精确寻找帧?

无 JS 的全屏 HTML5 视频背景