【发布时间】: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 属性放置的数字相匹配的数字
标签: http-live-streaming m3u mediastreamsegmenter