适用于 Windows 的 HLS 变量播放列表创建器

Posted

技术标签:

【中文标题】适用于 Windows 的 HLS 变量播放列表创建器【英文标题】:HLS varianplaylistcreator for Windows 【发布时间】:2012-06-22 23:53:31 【问题描述】:

我最初的任务是找到一个适用于 Windows 的分段器,它可以在不更改其编解码器的情况下拆分 h264\aac 视频文件并使其可通过 HLS 播放。

对我来说最好的方法是像这样使用 ffmpeg:

ffmpeg -i encoded.mp4 -c copy -map 0 -vbsf h264_mp4toannexb -flags -global_header -f segment -segment_time 10 -segment_format mpegts stream%d.ts

现在,这或多或少正确地拆分了文件,尽管mediastreamvalidator 发出了几个警告,但我仍然能够播放视频。

但是,棘手的部分是:ffmpeg 无法为您创建 .m3u8 文件。这不是问题,除非您需要创建我需要的变体播放列表文件。 所以现在我需要找到或编写一个模仿varianplaylistcreator的Windows应用程序

假设您为每个不同的带宽编码了相同的视频:64、150、300、500、800、1200 和 2400。现在,在分割每个视频之后,您可能希望将这些片段放入单独的文件夹中包括每个再现的播放列表文件。

现在我们可以创建一个变体播放列表文件,在其中列出所有演绎版,并说明服务器应自动切换服务于不同演绎版的带宽。

典型的变体播放列表如下所示:

#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=512376
500/500k_512x384_x264_372_quicktime_128.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=68795
64/64k_256x192_x264_32_quicktime_32.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=155580
150/150k_256x192_x264_118_quicktime_32.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=308895
300/300k_512x384_x264_172_quicktime_128.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=811310
800/800k_512x384_x264_672_quicktime_128.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1210182
1200/1200k_1024x768_x264_1072_quicktime_128.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=2408106
2400/2400k_1024x768_x264_2272_quicktime_128.m3u8

注意 BANDWITH 属性值。我怀疑这些是varinatplaylistcreator 计算的值。

我不知道它是怎么做到的。我想不知何故它需要每个再现的视频(片段)的平均比特率,并以此为基础。

所以我的问题是:这些是如何计算的。 或者也许有人已经创建了一个可以在 Windows 上运行并创建变体播放列表的工具。

【问题讨论】:

BANDWIDTH 属性不是平均带宽,实际上是最大带宽。 您需要担心的另一件事是每个再现是否在完全相同的位置分段。通常,这意味着您需要一个固定的“GOP”(图片组——I 帧出现的频率)大小。 @vipw...你能详细解释一下吗?谢谢 在不同比特率之间切换时,应该对用户完全透明。这要求每个比特率的 ts 文件在完全相同的逻辑边界处进行分段。但是,分段只能在某些位置进行。它必须是所有过去的帧都没有前向引用的点,并且所有未来的帧都不会在流中向后引用。视频流的这个独立部分通常称为 GOP。对于 HLS,您需要使用固定 GOP 大小对每个流进行编码,以便所有流始终具有同步的 GOP 边界。 @vipw 那么它是如何准确计算最大带宽的呢?我仍然无法得到它。我试图通过简单地将文件大小除以持续时间并将其乘以 8 来获得它。尝试使用 MediaInfo 和 ffprobe,仍然无法获得与 variantplaylistcreator 为 BANDWIDTH 属性放置的数字相匹配的数字 【参考方案1】:

FFmpeg 可以报告 ts 流的比特率。使用 ffprobe 工具,你会得到如下输出:

Input #0, mpegts, from 'foo.ts':
  Duration: 00:04:50.87, start: 2.000011, bitrate: 10381 kb/s
  Program 1
    Stream #0.0[0x810]: Video: h264 (High), yuv420p, 1280x720 [PAR 1:1 DAR 16:9], 25 fps, 25 tbr, 90k tbn, 50 tbc

比特率以每秒千比特为单位,因此将其乘以 1024,您将获得 BANDWIDTH 标签所需的值。

【讨论】:

这与varianplaylistcreator 放在那里的值不匹配。我已经尝试了一切,尝试使用 MediaInfo 和 ffprobe 获取值,尝试将文件大小除以持续时间并将其乘以 8 - 仍然数字不匹配...... WTH? @Agzam Precision 不是必需的。如果你在 10% 以内,我不会汗流浃背。要求是规定的带宽不低于实际带宽。但回到现实世界,这只是让客户端猜测哪个流最适合其网络连接,并相应地进行调整。 @Agzam 当谈到比特率而不是字节率时,你乘以 1000 而不是 1024。1 kbps == 1000 bps 而 1KBps == 1024 Bps。【参考方案2】:

您可以使用Bento4。他们在文档中指定我们可以使用它来代替 Apple 的 variantplaylistcreator

【讨论】:

以上是关于适用于 Windows 的 HLS 变量播放列表创建器的主要内容,如果未能解决你的问题,请参考以下文章

RTMP vs HLS vs HDS

在 Chrome 上使用 Shaka Player 播放 HLS m3u8

直播 - HLS + RTSP 使用 Video.js (Wowza 服务器)

VideoJS 适用于 safari 但不适用于 chrome 中的某些带有 CORS 的视频

如何获取绑定到我正在运行的控制台窗口的进程列表,该列表也适用于 Windows 2000?

在 Windows 上获取当前正在播放的媒体缩略图的方法仅适用于每个 Python 实例