当用户搜索到另一个时间时计算 HTML5 视频流中的 .m4s 段文件后缀
Calculate .m4s segment file suffix in HTML5 video streaming when user seeks to another time
我使用 Mp4Box 为一个长的 MP4 视频创建了固定长度的片段。 Mp4Box 创建一个元信息文件 mv_init.mp4
和 mv_1.m4s
、mv_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
之后下载了更多文件,然后才继续流式传输 。
如何正确计算分段文件个数,让搜索后的流媒体流畅,不下载任何额外的文件?
为了创建 MP4 视频的片段,我使用了以下命令:
MP4Box -dash 10000 -out video.mpd -dash-profile live -segment-name mv_ -rap video.mp4
我已经对此事进行了研究,并找到了真正的原因。加载段的计算是正确的。问题在于视频文件中的关键帧间隔。关键帧是视频中的一个帧,随后可以从该帧加载视频,并从该点开始 运行。所以在我的例子中,我需要在每个片段的开头插入关键帧。因此,当我们在不同的时间位置搜索视频时,加载的下一个片段在其开头包含一个关键帧。
可以使用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、.. 等在每个片段文件的开头都有关键帧的片段。
我使用 Mp4Box 为一个长的 MP4 视频创建了固定长度的片段。 Mp4Box 创建一个元信息文件 mv_init.mp4
和 mv_1.m4s
、mv_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
之后下载了更多文件,然后才继续流式传输 。
如何正确计算分段文件个数,让搜索后的流媒体流畅,不下载任何额外的文件?
为了创建 MP4 视频的片段,我使用了以下命令:
MP4Box -dash 10000 -out video.mpd -dash-profile live -segment-name mv_ -rap video.mp4
我已经对此事进行了研究,并找到了真正的原因。加载段的计算是正确的。问题在于视频文件中的关键帧间隔。关键帧是视频中的一个帧,随后可以从该帧加载视频,并从该点开始 运行。所以在我的例子中,我需要在每个片段的开头插入关键帧。因此,当我们在不同的时间位置搜索视频时,加载的下一个片段在其开头包含一个关键帧。
可以使用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、.. 等在每个片段文件的开头都有关键帧的片段。