HTTPLiveStreaming直播技术分析与实现_第1页
HTTPLiveStreaming直播技术分析与实现_第2页
HTTPLiveStreaming直播技术分析与实现_第3页
HTTPLiveStreaming直播技术分析与实现_第4页
HTTPLiveStreaming直播技术分析与实现_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、HTTP Live Streaming直播技术分析与实现不经意间发现,大半年没写博客了,自觉汗颜。实则 2012后半年,家中的事一样接着一样发生,实在是没有时间。快过 年了,总算忙里偷闲,把最近的一些技术成果,总结成了文章,与大家分享。前些日子,也是项目需要,花了一些时间研究了HTTP Live Streaming (HLS )技术,并实现了一个 HLS编码器HLSLiveEncoder ,当然,C+写的。其功能是采集摄像头与麦克风,实时进行 H.264视频编码和AAC音频编码,并按照HLS 的协议规范,生成分段的标准TS文件以及m3u8索引文件。通过我的HLSLiveEncoder 和第三方

2、Http服务器(例如:Nginx ), 成功实现了 HTTP Live Streaming 直播,并在iphone上测试通过。我就把这当中的一些收获写在这里。HLS技术要点分析HTTP Live Streaming (HLS)是苹果公司(Apple Inc.)实现的基于HTTP的流媒体传输协议,可实现流媒体的直播和点播,主要应用在iOS系统,为iOS设备(如iPhone、iPad )提供音视频直播和点播方案。HLS点播,基本上就是常见的分段 HTTP点播,不同在于,它的分段非常小。要实现HLS点播,重点在于对媒体文件分段,目前有不少开源工具可以使用,这里我就不再讨论,只谈HLS直播技术。相对于

3、常见的流媒体直播协议,例如RTMP协议、RTSP协议、MMS协议等,HLS直播最大的不同在于,直播客户端获取到的,并不是一个完整的数据流。HLS协议在服务器端将直播数据流存储为连续的、很短时长的媒体文件(MPEG-TS格式),而客户端则不断的下载并播放这些小文件,因为服务器端总是会将最新的直播数据生成新的小文件,这样客户端只要不停的按顺序播放从服务器获取到的文件,就实现了直播。由此可见,基本上可以认为,HLS是以点播的技术方式来实现直播。由于数据通过HTTP协议传输,所以完全不用考虑防火墙或者代理的问题,而且分段文件的时长很短,客户端可以很快的选择和切换码率,以适应不同带宽条件下的播放。不过H

4、LS的这种技术特点,决定了它的延迟一般总是会高于普通的流媒体直播协议。根据以上的了解要实现 HTTP Live Streaming 直播,需要研究并实现以下技术关键点1. 采集视频源和音频源的数据2. 对原始数据进行 H264编码和AAC编码3. 视频和音频数据封装为 MPEG-TS包4. HLS分段生成策略及m3u8索引文件5. HTTP传输协议其中第1点和第2点,我之前的文章中已经提到过了,而最后一点,我们可以借助现有的HTTP服务器,所以,实现第 3点和第4点是关键所在。程序框架与实现通过以上分析,实现HLS LiveEncoder 直播编码器,其逻辑和流程基本上很清楚了:分别开启音频与

5、视频编码线程,通过 DirectShow (或其他)技术来实现音视频采集,随后分别调用libx264和libfaac进行视频和音频编码。两个编码线程实时编码音视频数据后,根据自定义的分片策略,存储在某个MPEG-TS格式分段文件中,当完成一个分段文件的存储后,更新 m3u8索引文件。如下图所示:DShow音频教据采集 MH AudioEncoderThread |HLSLiveEncoderAACS码器I分片策略上图中HLSLiveEncoder当收到视频和音频数据后,需要首先判断,当前分片是否应该结束,并创建新分片,以延续 TS分片的不断生成。需要注意的是,新的分片,应当从关键帧开始,防止播

6、放器解码失败。核心代码如下所示:113 114 115|116 |11711811912G121122123124 1251 1261127 1281129130131 132 133|134 135/从关爵婚if (isKeyframe)/椅查是否应当创哪盼片文件if (CheckRecordTime5tamp(timestamp)(ts muxers tdi:st ring tsfilename = ts n»uxer->Fil ename ();ts_muxer_->WriteEnd();delete ts_muxer_;ts muxer = 0;/更新相斗索弓:文

7、件 UpdateM2U0List(tsfilename, real_duration_/lGee);生成新的分片文件名std:st ring newfilename = GetRecprdFilename); tsmuxer_ = new TSMuxer(newfilename.c_str(); ts muxer >WriterHeader():TsMuxer的接口也是比较简单的g1011123 3-class TSMuxer141516171819 2G212223242526212829303132-TSMuxert);std:string Filename() return fil

8、enamS": /初始化,创新PEG-TS音频柚源.输出流 void WriterHeacleri:/予内存中剽金薮据写入文件 void WriteEnd();/写入视频数据void WriteVideoData(char* bufr写入音频Mvoid WrxteAudioData(char* buf rH废弃void WriteVideoSeqheader(char*int bufLen, bool isKeyframe r unsigned int tiint bufLen, unsigned int timestamp);buf, int bufLen);#include &#

9、39;mpegts/mpgtsenc .h1*define USE ts MUXER LOGpublic:explicit TSMuxer(const char* filename);343536373839private:std:string filename_;_ int64 time_begin ;FILE* fp_; _-bool is_video_begin_;MpegTSWnte* mpegts_writer;HLS分段生成策略和 m3u81.分段策略 HLS的分段策略,基本上推荐是 10秒一个分片,当然,具体时间还要根据分好后的分片的实际时长做标注通常来说,为了缓存等方面的原因,

10、在索引文件中会保留最新的三个分片地址,以类似滑动窗口 ”的形式,进行更新。2. m3u8文件简介m3u8 ,是HTTP Live Streaming 直播的索引文件。m3u8基本上可以认为就是.m3u格式文件,区别在于,m3u8文件使 用UTF-8字符编码。#EXTM3Um3u文件头,必须放在第一行#EXT-X-MEDIA-SEQUENCE第一个TS分片的序列号#EXT-X-TARGETDURATION每个分片TS的最大的时长#EXT-X-ALLOW-CACHE是否允许 cache#EXT-X-ENDLISTm3u8文件结束符#EXTINFextra info,分片TS的信息,如时长,带宽等一个简单的m3u8索引文件帕EXTM3U#EXT-X-1-IEDIA-SEQUENCE : 6 #EXT-X-TARGETDURATION:10#EXTINF:ID, Live 20130127214204.ts4EXTINF:1D, live 201

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论