Http live streaming 用于Windows的HLS创建程序

Http live streaming 用于Windows的HLS创建程序,http-live-streaming,m3u,mediastreamsegmenter,Http Live Streaming,M3u,Mediastreamsegmenter,我最初的任务是为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 #EXTM3U #EXT-X-

我最初的任务是为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
#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
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
现在,这或多或少正确地分割了文件,尽管
mediastreamvalidator
抛出了几个警告,但我仍然能够播放视频

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

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

现在,我们可以创建一个变体播放列表文件,其中列出所有格式副本,并说明服务器应自动切换哪些带宽以提供不同的格式副本

不同的播放列表通常如下所示:

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
#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
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
请注意带有属性值的条带。我怀疑这些值是由
VarinatPlayCreator
计算的

我不知道它是怎么做到的。我想它会以视频(片段)的平均比特率作为每个格式副本的基础

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

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

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
#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
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,就得到了带宽标签所需的值。

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

带宽属性不是平均带宽,而是最大带宽。另一件你需要担心的事情是,如果每个格式副本被分割在完全相同的位置。通常,这意味着您需要一个固定的“GOP”(一组图片——I帧出现的频率)大小。@vipw。。。你能详细解释一下吗?感谢在不同比特率之间切换时,它应该对用户完全透明。这要求在完全相同的逻辑边界上分割每个比特率的ts文件。但是,分割只能在某些位置进行。它必须是这样一个点:所有过去的帧都没有前向引用,而所有未来的帧都不会在流中引用回。视频流的这个独立部分通常称为GOP。对于HLS,您需要使用固定的GOP大小对每个流进行编码,以便所有流始终具有同步的GOP边界。@vipw那么它如何准确计算最大带宽?我还是不明白。我试图通过简单地将文件大小除以持续时间并将其乘以8来获得它。已尝试使用MediaInfo和ffprobe,但仍无法获取与variantplaylistcreator为带宽属性设置的数字匹配的数字这与VariantPlayCreator设置的值不匹配。我尝试了所有方法,尝试使用MediaInfo和ffprobe获取值,尝试将文件大小除以持续时间,再乘以8-仍然数字不匹配。。。WTH?@Agzam精度不是必需的。如果你在10%以内,我就不会担心了。要求规定的带宽不得低于实际带宽。但回到现实世界中,它只是让客户端猜测哪个流最适合其网络连接,并相应地进行调整。@Agzam当涉及比特率而不是字节数时,您将乘以1000,而不是1024。1 kbps==1000 bps,而1 kbps==1024 bps。