转自:http://www.cnblogs.com/haibindev/archive/2013/01/30/2880764.html
HLS技术要点分析
HTTP Live Streaming(HLS)是苹果公司(Apple Inc.)实现的基于HTTP的流媒体传输协议,可实现流媒体的直播和点播,主要应用在iOS系统,为iOS设备(如iPhone、iPad)提供音视频直播和点播方案。HLS点播,基本上就是常见的分段HTTP点播,不同在于,它的分段非常小。要实现HLS点播,重点在于对媒体文件分段,目前有不少开源工具可以使用,这里我就不再讨论,只谈HLS直播技术。
相对于常见的流媒体直播协议,例如RTMP协议、RTSP协议、MMS协议等,HLS直播最大的不同在于,直播客户端获取到的,并不是一个完整的数据流。HLS协议在服务器端将直播数据流存储为连续的、很短时长的媒体文件(MPEG-TS格式),而客户端则不断的下载并播放这些小文件,因为服务器端总是会将最新的直播数据生成新的小文件,这样客户端只要不停的按顺序播放从服务器获取到的文件,就实现了直播。由此可见,基本上可以认为,HLS是以点播的技术方式来实现直播。由于数据通过HTTP协议传输,所以完全不用考虑防火墙或者代理的问题,而且分段文件的时长很短,客户端可以很快的选择和切换码率,以适应不同带宽条件下的播放。不过HLS的这种技术特点,决定了它的延迟一般总是会高于普通的流媒体直播协议。
根据以上的了解要实现HTTP Live Streaming直播,需要研究并实现以下技术关键点
- 采集视频源和音频源的数据
- 对原始数据进行H264编码和AAC编码
- 视频和音频数据封装为MPEG-TS包
- HLS分段生成策略及m3u8索引文件
- HTTP传输协议
其中第1点和第2点,我之前的文章中已经提到过了,而最后一点,我们可以借助现有的HTTP服务器,所以,实现第3点和第4点是关键所在。
程序框架与实现
通过以上分析,实现HLS LiveEncoder直播编码器,其逻辑和流程基本上很清楚了:分别开启音频与视频编码线程,通过DirectShow(或其他)技术来实现音视频采集,随后分别调用libx264和libfaac进行视频和音频编码。两个编码线程实时编码音视频数据后,根据自定义的分片策略,存储在某个MPEG-TS格式分段文件中,当完成一个分段文件的存储后,更新m3u8索引文件。如下图所示:
上图中HLSLiveEncoder当收到视频和音频数据后,需要首先判断,当前分片是否应该结束,并创建新分片,以延续TS分片的不断生成。需要注意的是,新的分片,应当从关键帧开始,防止播放器解码失败。核心代码如下所示:
TsMuxer的接口也是比较简单的。
HLS分段生成策略和m3u8
1. 分段策略
- HLS的分段策略,基本上推荐是10秒一个分片,当然,具体时间还要根据分好后的分片的实际时长做标注
- 通常来说,为了缓存等方面的原因,在索引文件中会保留最新的三个分片地址,以类似“滑动窗口”的形式,进行更新。
2. m3u8文件简介
m3u8,是HTTP Live Streaming直播的索引文件。m3u8基本上可以认为就是.m3u格式文件,区别在于,m3u8文件使用UTF-8字符编码。
#EXTM3U m3u文件头,必须放在第一行 #EXT-X-MEDIA-SEQUENCE 第一个TS分片的序列号 #EXT-X-TARGETDURATION 每个分片TS的最大的时长 #EXT-X-ALLOW-CACHE 是否允许cache #EXT-X-ENDLIST m3u8文件结束符 #EXTINF extra info,分片TS的信息,如时长,带宽等
一个简单的m3u8索引文件
运行效果
在Nginx工作目录下启动HLSLiveEncoder,并用VLC播放器连接播放
通过iPhone播放的效果
相关推荐
http live streaming protocol http live streaming protocol
http live streaming guide
HLS http live streaming 白皮书 draft-pantos-http-live-streaming
HTTP Live Streaming伪直播的设计与实现,李志昂,马跃,HTTP Live Streaming是由Apple公司提出的新一代的移动流媒体传输协议,通过普通的HTTP Server向客户端提供接近实时的流媒体服务,在移动终端�
2012年3月HTTP Live Streaming (HLS) 视频直播技术的第8个版本的修订草案,常用的流媒体协议主要有 HTTP 渐进下载和基于 RTSP/RTP 的实时流媒体协议,这二种基本是完全不同的东西,目前比较方便又好用的我建议使用 ...
HTTP Live Streaming (HLS) 视频直播技术,常用的流媒体协议主要有 HTTP 渐进下载和基于 RTSP/RTP 的实时流媒体协议,这二种基本是完全不同的东西,目前比较方便又好用的我建议使用 HTTP 渐进下载的方法。...
Live Streaming Super guide2014年6月刊
draft-pantos-http-live-streaming-16.doc Example Playlist Files for use with HTTP Live Streaming.doc HLS_Sample_Encryption.pdf HTTP_Live_Streaming_Metadata_Spec.pdf StreamingMediaGuide.pdf ...
http-live-streaming-10 翻译件
HLS(Http live Streaming)流媒体协议。
The role of live streaming in building consumer trust and engagement with social commerce sellers
HLS之http_live_streaming_开发必备,很详细的讲解了每种m3u8文件中的标签的语法及用法,对学习hls有不少帮助
HTTP Live Streaming for iPhone iPad(HLS流媒体服务器) - coolham的专栏 - 博客频道 - CSDN.NET
spark Streaming和structed streaming分析,理解整个 Spark Streaming 的模块划分和代码逻辑。
一个 HTTP Live Streaming (HLS) python 库 Apple 提供了许多与 HLS 配合使用的工具,但这些工具只能在 OS X 上使用。该库旨在包括这些工具的功能以及更多功能,并在多个平台上提供这些功能。 支持 为了确保在这个...
Http Dynamic Streaming 点播直播服务器搭建、原理
带有 node.js 的 HTTP Live Streaming 电视台 该节点模块从文件夹中摄取 mp4 视频文件,将文件拆分为视频 TS 段,并旋转这些段,就好像文件在“实时”播放一样。 该模块还创建了一个服务器,为生成的 HLS 播放列表...
全英文,苹果公司对HLS协议的讲解,60多页,共计12章。
这篇文档主要讲的是APPLE的HTTP流方案,HTTP流的体系,以及HTTP与RTSP的区别