赞
踩
HLS(HTTP Live Streaming)是一种直播流协议,它利用当前广泛使用的 HTTP 技术为广大观众提供实时视频+音频体验。
它最初由 Apple 于 2009 年开发,现已在从台式机、移动电话到智能电视等设备中得到广泛采用。iPhone 推动了其最初的采用,并且在移动领域拥有重要的市场份额,其默认支持的 HLS 是一个极好的助推器。
本文福利, 免费领取C++音视频学习资料包、技术视频/代码,内容包括(音视频开发,面试题,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,编解码,推拉流,srs)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓
让我们从高层次来了解HLS是如何工作的。从客户端(任何网络播放器)的角度来看,这些是其理解和播放媒体的步骤:
这是客户如何使用HLS的一个粗略计划。现在我们来看看这些播放列表/片段的具体内容。为了生成这些数据,我将使用媒体相关的瑞士军刀:ffmpeg。
让我们使用一个简单的命令创建一个示例视频:
ffmpeg -f lavfi -i testsrc -t 30 -pix_fmt yuv420p testsrc.mp4
这样就创建了一个时长为30秒的样本视频。
现在我们通过以下命令创建一个HLS播放列表:
ffmpeg -i testsrc.mp4 -c:v copy -c:a copy -f hls -hls_segment_filename data%02d.ts index.m3u8
这将在同一目录中创建一个播放列表,其中包含文件:
不知道它们是什么?让我们来了解一下该命令的作用以及这些文件的含义。
我们首先分解命令。
我们用 -i 告诉 ffmpeg 将 MP4 视频作为输入,注意这也可以直接接受 RTMP 输入;只需要说类似这样的话:
ffmpeg -listen 1 -i rtmp://127.0.0.1:1938/live -c:v copy -c:a copy -f hls -hls_segment_filename data%02d.ts index.m3u8
这是另一个令人兴奋的方面,我们将在本文中进一步讨论。
接下来,理解-c:v copy和-c:a copy。这是一种将编码等音频/视频数据从源输入复制到输出的方式。您也可以在这里以不同的格式进行编码。例如,例如,如果您想在HLS播放列表中使用多种质量。
-f告诉ffmpeg我们的输出格式是什么,在本例中是 HLS。
-hls_segment_filename 告诉ffmpeg我们想要的片段文件名的格式。
最后一个参数是我们的主播放列表的名称。
现在,开始处理文件:
在编辑器中打开主播放列表,如下所示:
- #EXTM3U
- #EXT-X-VERSION:3
- #EXT-X-TARGETDURATION:10
- #EXT-X-MEDIA-SEQUENCE:0
- #EXTINF:10.000000,
- data00.ts
- #EXTINF:10.000000,
- data01.ts
- #EXTINF:10.000000,
- data02.ts
- #EXT-X-ENDLIST
让我们理解下这些标签:
对于敏锐的读者来说,他们可能已经注意到这里没有列出多种比特率。好吧,我想首先用一个简单的例子来解释基本结构。
为了理解 ABR,让我们使用一个已经托管的 URL,例如:https://demo.unified-streaming.com/k8s/features/stable/video/tears-of-steel/tears-of-steel.ism/.m3u8
下载播放列表时,它看起来像这样:
- #EXTM3U
- #EXT-X-VERSION:1
- ## Created with Unified Streaming Platform (version=1.11.20-26889)
-
- # variants
- #EXT-X-STREAM-INF:BANDWIDTH=493000,CODECS="mp4a.40.2,avc1.66.30",RESOLUTION=224x100,FRAME-RATE=24
- tears-of-steel-audio_eng=64008-video_eng=401000.m3u8
- #EXT-X-STREAM-INF:BANDWIDTH=932000,CODECS="mp4a.40.2,avc1.66.30",RESOLUTION=448x200,FRAME-RATE=24
- tears-of-steel-audio_eng=128002-video_eng=751000.m3u8
- #EXT-X-STREAM-INF:BANDWIDTH=1197000,CODECS="mp4a.40.2,avc1.77.31",RESOLUTION=784x350,FRAME-RATE=24
- tears-of-steel-audio_eng=128002-video_eng=1001000.m3u8
- #EXT-X-STREAM-INF:BANDWIDTH=1727000,CODECS="mp4a.40.2,avc1.100.40",RESOLUTION=1680x750,FRAME-RATE=24,VIDEO-RANGE=SDR
- tears-of-steel-audio_eng=128002-video_eng=1501000.m3u8
- #EXT-X-STREAM-INF:BANDWIDTH=2468000,CODECS="mp4a.40.2,avc1.100.40",RESOLUTION=1680x750,FRAME-RATE=24,VIDEO-RANGE=SDR
- tears-of-steel-audio_eng=128002-video_eng=2200000.m3u8
-
- # variants
- #EXT-X-STREAM-INF:BANDWIDTH=68000,CODECS="mp4a.40.2"
- tears-of-steel-audio_eng=64008.m3u8
- #EXT-X-STREAM-INF:BANDWIDTH=136000,CODECS="mp4a.40.2"
- tears-of-steel-audio_eng=128002.m3u8
在这里,我们看到一个新标签EXT-X-STREAM-INF。此标签提供有关给定流可用的所有变体的更多信息。该标签后面是任意数量的属性。
本文福利, 免费领取C++音视频学习资料包、技术视频/代码,内容包括(音视频开发,面试题,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,编解码,推拉流,srs)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓
这些stream-inf标签后面的行指定在哪里可以找到相应的变体流,这是一个与我们之前看到的类似的播放列表。
之前,我们看到了一个 RTMP 输入ffmpeg命令。它帮助我们了解现场 HLS 播放列表的另一个属性。重新审视该命令,它看起来像这样:
- ffmpeg -listen 1 -i rtmp://127.0.0.1:1938/live -c:v copy -c:a copy -f hls -hls_segment_filename data%02d.ts
- index.m3u8
该命令应该给出类似于下面的输出,这似乎被卡住了。
现在,让我们来满足您成为流媒体的梦想!我们可以使用任何 RTMP 源,甚至是 ffmpeg,但在我们的演示中,我们将使用 OBS 发送数据到我们的 ffmpeg服务器监听 RTMP 输入。我在其中创建了一个简单的屏幕共享捕获输入,然后导航到设置中的流部分,在这里你会看到类似这样的屏幕:
将服务填写为自定义,并 rtmp://12.0.0.1:1938/live使用空的流密钥添加服务器。现在单击应用并按OK。
我们将登陆OBS的默认视图:
当我们点击 Start Streaming时,我们将流媒体传输到本地 RTMP-to-HLS 服务器。您会注意到运行ffmpeg命令的文件夹。有新的文件名:
让我们检查一下index.m3u8,我捕捉到的结果是:
- #EXTM3U
- #EXT-X-VERSION:3
- #EXT-X-TARGETDURATION:4
- #EXT-X-MEDIA-SEQUENCE:3
- #EXTINF:4.167000,
- data03.ts
- #EXTINF:4.167000,
- data04.ts
- #EXTINF:4.166000,
- data05.ts
- #EXTINF:4.167000,
- data06.ts
- #EXTINF:4.167000,
- data07.ts
注意到没有结束播放列表标签了吗?这是因为这是一个实时播放列表,随着时间的推移不断变化,出现新的片段。例如,一段时间后,我的本地播放列表看起来像这样:
- #EXTM3U
- #EXT-X-VERSION:3
- #EXT-X-TARGETDURATION:4
- #EXT-X-MEDIA-SEQUENCE:9
- #EXTINF:4.167000,
- data09.ts
- #EXTINF:4.167000,
- data10.ts
- #EXTINF:4.166000,
- data11.ts
- #EXTINF:4.167000,
- data12.ts
- #EXTINF:0.640667,
- data13.ts
- #EXT-X-ENDLIST
旧的片段将被新的片段所取代。这有助于在直播活动时提供最新数据。
这在一定程度上涵盖了播放列表。现在让我们来谈谈片段文件。
媒体段使用容器格式存储实际编码的视频/音频数据。详细讨论容器格式不在本文讨论范围之内。
HLS最初只支持MPEG-2 TS容器。这个决定不同于其他基于HTTP协议的容器格式。例如,DASH一直使用fMP4(碎片化MP4)。虽然最后苹果宣布在HLS中支持fMP4,但现在它已经正式被规范所支持。
媒体段大小没有定义。通常情况下,媒体段的大小为10秒左右,但规范的另一部分规定了媒体段的大小。根据规范,必须获取并准备好至少三个片段才能开始播放。这意味着对于10秒的片段,在客户端开始播放之前需要加载30秒的缓冲区。我们可以根据需要随时更改,这也是我们在减少延迟时常用的调整参数。
拥有开放标准有助于采用和增长,同时使开放和封闭软件/硬件堆栈之间的互操作变得更加容易。HLS 在直播领域也发挥着同样的作用——它被广泛采用、简单而强大。它并没有尝试从头开始重新发明轮子,而是采用了当前广泛接受的协议并在此基础上构建。
本文来自转载,版权归原作者所有。作者:Fenil Jain。如需转载,请注明出处:https://www.nxrte.com/jishu/yinshipin/28911.html
本文福利, 免费领取C++音视频学习资料包、技术视频/代码,内容包括(音视频开发,面试题,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,编解码,推拉流,srs)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。