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

13
我使用Mp4Box为长MP4视频创建了固定长度的片段。Mp4Box会创建一个元信息文件mv_init.mp4和类似mv_1.m4smv_2.m4s等的片段文件。我使用HTML5 Media Source Extensions流式传输视频,而且流媒体工作正常。
问题是我无法利用HTML5播放器的时间跳转功能。当用户使用进度条跳转到另一个时间点时,我需要获取该currentTime所对应的正确片段文件(mv_{number}.m4s)。
例如:
  • 视频总时长:2小时
  • 片段大小:10秒
  • 用户跳转到时间:25分钟

25分钟 = 25 × 60秒 = 1500秒。由于每个片段为10秒,我需要第1500 / 10 = 150个片段文件,即mv_150.m4s

看起来计算是正确的,但是HTML5播放器接着会mv_150.m4s之后下载更多的文件,然后才继续播放流媒体
如何正确计算片段文件号码,以便在跳转后流式传输可以平稳运行,不需要下载任何额外的文件?
创建MP4视频的片段,我使用了以下命令:
MP4Box -dash 10000 -out video.mpd -dash-profile live -segment-name mv_ -rap video.mp4

你是这个播放器的作者吗?能否请您提供一个 [mcve],即一个最小化的示例来演示问题。您使用的是哪个浏览器? - Palec
1个回答

4
我已研究此事并找到了真正的原因。加载片段的计算是正确的,问题在于视频文件中关键帧间隔不正确。关键帧是视频中可以随后加载和从该点运行的帧。因此,在我的情况下,我需要在每个片段的开头插入关键帧。因此,当我们在不同的时间位置搜索视频时,下一个被加载的片段包含其开头处的关键帧。
可以使用FFMPEG设置视频文件中的关键帧。例如,如果我们有一个每个片段为5秒的视频,则必须使用ffmpeg在5秒间隔处创建关键帧。设置关键帧时另一个重要的要点是查看视频的帧速率。视频必须具有固定的帧速率,以便我们可以精确计算关键帧的位置。 示例:
Video File: gladiator.mp4

Segment Size: 5 seconds

现在我们使用FFmpeg设置帧率和关键帧间隔。

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

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

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

MP4Box -dash 5000 -frag 5000 -out gladiator.mpd -dash-profile on-demand -segment-name mv_ gladiator-output.mp4

它将创建像mv_1、mv_2等片段,每个片段文件开头都有关键帧。

可搜索的Dash流示例


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接