HLS(HTTP Live Streaming)是Apple的动态码率自适应技术。主要用于PC和Apple终端的音视频服务。包括一个m3u(8)的索引文件,TS媒体分片文件和key加密串文件。

HLS的关键其实是生成m3u8索引文件和TS媒体分片,下面我将通过以下几个步骤讲述m3u8及TS媒体分片的生成:

第一步---获取TS文件:

TS(Transport Stream)既传输流,标准制定于mpeg2文档协议中,当时TS格式主要是为了数字电视传输而制定,制定的年限相当早,在网上能找到很完备的mpeg2文档介绍。大家可以参考mpege-2文档标准中TS流介绍学习该格式。

现在的我们下载的高清电影以mkv格式居多,早期的的电影可能一rmvb和avi居多,更早的甚至还有mpg格式,现在流行的视频网站下载的视频基本都是flv格式。这些格式都是非TS格式,不过不要紧,现在视频转码的软件也非常多,我们可以通过以下两种方式进行转码。

1,通过格式工厂软件,这是一个比较成熟的软件,网上百度下载即可,不过只有软件,不利于后期源码的直接开发;

    下载地址:http://www.pcfreetime.com/CN/index.html

2,通过ffmpeg进行格式转换,该工程为开源项目,我们在实际开发的过程中可以直接集成该源码,(具体的集成方式该篇文章不讲解,后期将对怎么封装调用ffmpeg做出相应介绍)。目前我们只是想获取TS文件用于生产m3u8索引文件和TS分片而已,直接下载ffmpeg的可执行程序,通过ffmpeg.exe转换即可:

下载地址:http://ffmpeg.org/

通过命令行模式进入到ffmpeg.exe所在的目录,在命令行中输入:ffmpeg.exe -i XXX.flv xxx.ts 即可,如下图:

图1

第二步--生成m3u8索引文件和TS媒体分片

1, m3u8 源码下,

下载地址:

https://github.com/johnf/m3u8-segmenter/archive/master.zip 该地址的源码主要是在linux系统编译,不过也能修改成在windows下编译。

windows的源码下载 :

官网:http://www.espend.de/artikel/iphone-ipad-ipod-http-streaming-segmenter-and-m3u8-windows.html     源码地址http://code.google.com/p/httpsegmenter/    不过也要依赖ffmpeg库,稍微修改下即可。

其实以上两个路径的源码其实是一样滴,下面那个是德国人修改写的,看后缀de就知道了,可能需要翻墙才能打开。

下面是截取segmenter.c中的代码分片片段:

  1. do {
  2. double segment_time = 0.0;
  3. AVPacket packet;
  4. double packetStartTime = 0.0;
  5. double packetDuration = 0.0;
  6.  
  7. if (!decode_done)
  8. {
  9. decode_done = av_read_frame(ic, &packet);
  10. if (!decode_done)
  11. {
  12. if (packet.stream_index != video_index &&
  13. packet.stream_index != audio_index)
  14. {
  15. av_free_packet(&packet);
  16. continue;
  17. }
  18.  
  19. timeStamp =
  20. (double)(packet.pts) *
  21. (double)(ic->streams[packet.stream_index]->time_base.num) /
  22. (double)(ic->streams[packet.stream_index]->time_base.den);
  23.  
  24. if (av_dup_packet(&packet) < )
  25. {
  26. fprintf(stderr, "Could not duplicate packet\n");
  27. av_free_packet(&packet);
  28. break;
  29. }
  30.  
  31. insertPacket(streamLace, &packet, timeStamp);
  32. }
  33. }
  34.  
  35. if (countPackets(streamLace) < && !decode_done)
  36. {
  37. /* allow the queue to fill up so that the packets can be sorted properly */
  38. continue;
  39. }
  40.  
  41. if (!removePacket(streamLace, &packet))
  42. {
  43. if (decode_done)
  44. {
  45. /* the queue is empty, we are done */
  46. break;
  47. }
  48.  
  49. assert(decode_done);
  50. continue;
  51. }
  52.  
  53. packetStartTime =
  54. (double)(packet.pts) *
  55. (double)(ic->streams[packet.stream_index]->time_base.num) /
  56. (double)(ic->streams[packet.stream_index]->time_base.den);
  57.  
  58. packetDuration =
  59. (double)(packet.duration) *
  60. (double)(ic->streams[packet.stream_index]->time_base.num) /
  61. (double)(ic->streams[packet.stream_index]->time_base.den);
  62.  
  63. #if !defined(NDEBUG) && (defined(DEBUG) || defined(_DEBUG))
  64. if (av_log_get_level() >= AV_LOG_VERBOSE)
  65. fprintf(stderr,
  66. "stream %i, packet [%f, %f)\n",
  67. packet.stream_index,
  68. packetStartTime,
  69. packetStartTime + packetDuration);
  70. #endif
  71.  
  72. segment_duration = packetStartTime + packetDuration - prev_segment_time;
  73.  
  74. // NOTE: segments are supposed to start on a keyframe.
  75. // If the keyframe interval and segment duration do not match
  76. // forcing the segment creation for "better seeking behavior"
  77. // will result in decoding artifacts after seeking or stream switching.
  78. if (packet.stream_index == video_index && (packet.flags & AV_PKT_FLAG_KEY || strict_segment_duration)) {
  79. segment_time = packetStartTime;
  80. }
  81. else if (video_index < ) {
  82. segment_time = packetStartTime;
  83. }
  84. else {
  85. segment_time = prev_segment_time;
  86. }
  87.  
  88. if (segment_time - prev_segment_time + segment_duration_error_tolerance >
  89. target_segment_duration + extra_duration_needed)
  90. {
  91. avio_flush(oc->pb);
  92. avio_close(oc->pb);
  93.  
  94. // Keep track of accumulated rounding error to account for it in later chunks.
  95. segment_duration = segment_time - prev_segment_time;
  96. rounded_segment_duration = (int)(segment_duration + 0.5);
  97. extra_duration_needed += (double)rounded_segment_duration - segment_duration;
  98.  
  99. updatePlaylist(playlist,
  100. playlist_filename,
  101. output_filename,
  102. output_index,
  103. rounded_segment_duration);
  104.  
  105. _snprintf(output_filename, strlen(output_prefix) + , "%s-%u.ts", output_prefix, ++output_index);
  106. if (avio_open(&oc->pb, output_filename, AVIO_FLAG_WRITE) < ) {
  107. fprintf(stderr, "Could not open '%s'\n", output_filename);
  108. break;
  109. }
  110.  
  111. // close when we find the 'kill' file
  112. if (kill_file) {
  113. FILE* fp = fopen("kill", "rb");
  114. if (fp) {
  115. fprintf(stderr, "user abort: found kill file\n");
  116. fclose(fp);
  117. remove("kill");
  118. decode_done = ;
  119. removeAllPackets(streamLace);
  120. }
  121. }
  122. prev_segment_time = segment_time;
  123. }
  124.  
  125. ret = av_interleaved_write_frame(oc, &packet);
  126. if (ret < ) {
  127. fprintf(stderr, "Warning: Could not write frame of stream\n");
  128. }
  129. else if (ret > ) {
  130. fprintf(stderr, "End of stream requested\n");
  131. av_free_packet(&packet);
  132. break;
  133. }
  134.  
  135. av_free_packet(&packet);
  136. } while (!decode_done || countPackets(streamLace) > );

2, 把下载下来的源码直接在vs中编译生成exe即可, 如我生成的exe为m3u8.exe:

图2

3, 通过命令行进入该目录,并在命令行中输入: m3u8.exe -d 10 -x m3u8list.m3u8 即可生成.m3u8文件和ts分片文件,如图2目录文件的m3u8list.m3u8 和-1.ts、-2.ts和-3.ts文件。

图3

4, 如以图2的目录列表,直接用VLC播放器就可以播放m3u8list.m3u8文件, 用写字板查看m3u8文件内容为:

#EXTM3U
#EXT-X-TARGETDURATION:10
#EXTINF:10,
-1.ts
#EXTINF:10,
-2.ts
#EXTINF:9,
-3.ts
#EXT-X-ENDLIST

好了,大功告成!  我们可以直接播放m3u8list.m3u8 和-1.ts、-2.ts、-3.ts文件 ,  也可以直接用http协议传输这些文件,就成了hls协议了

HLS(HTTP Live Streaming)协议之m3u8文件生成方式的更多相关文章

  1. 如何生成HLS协议的M3U8文件

    什么是HLS协议: HLS(Http Live Streaming)是由Apple公司定义的用于实时流传输的协议,HLS基于HTTP协议实现,传输内容包括两部分,一是M3U8描述文件,二是TS媒体文件 ...

  2. 将视频转换为 HLS(HTTP Live Streaming) 协议格式文件

    就是将视频文件转码(H264+ACC).分片(n个.ts文件).生成列表(.m3u8) 方便网站提供视频播放服务,提升加载速度,节省流量. 1.准备好源视频文件. 2.下载 ffmpeg(http:/ ...

  3. linux下搭建生成HLS所需的.ts和.m3u8文件

    要想利用HLS来实现视频的在线播放,就得需要将一个完整的视频文件切割成多个ts视频流,然后利用m3u8的索引文件来播放. 在Mac下,苹果提供了streamingTools的工具,里面有mediafi ...

  4. (HLS播放器之中的一个)HLS协议之M3U8解析

    參照 http://tools.ietf.org/html/draft-pantos-http-live-streaming-08, 能够对M3U8有比較系统的认识. HLS(HTTP Live St ...

  5. [视频播放] HLS协议之M3U8、TS流详解

    本文转载自:<hls之m3u8.ts流格式详解> HLS,Http Live Streaming 是由Apple公司定义的用于实时流传输的协议,HLS基于HTTP协议实现,传输内容包括两部 ...

  6. HLS的M3U8文件介绍

    HLS的M3U8文件介绍 HLS (HTTP Live Streaming)是Apple的动态码率自适应技术.主要用于PC和Apple终端的音视频服务. 相较于实时传输协议(RTP),HLS可以穿过任 ...

  7. MP4大文件虚拟HLS分片技术,避免服务器大量文件碎片

    MP4大文件虚拟HLS分片技术,避免点播服务器的文件碎片 本文主要介绍了通过虚拟分片技术,把MP4文件,映射为HLS协议中的一个个小的TS分片文件,实现了在不实际切分MP4文件的情况下,通过HLS协议 ...

  8. 基于HLS(HTTP Live Streaming)的视频直播分析与实现

    转自:http://www.cnblogs.com/haibindev/archive/2013/01/30/2880764.html HLS(HTTP Live Streaming)的分析: HTT ...

  9. m3u8文件合并处理

    m3u8文件合并处理 简介 M3U8 是 Unicode 版本的 M3U,用 UTF-8 编码."M3U" 和 "M3U8" 文件都是苹果公司使用的 HTTP ...

随机推荐

  1. Android用gif做启动页

    公司的一个app的启动页想改为gif图,之前没有在android中加入过gif,所以赶紧饿补! 前言 我们都知道ImageView是不能完美加载Gif格式的图片,如果我们在ImageView中src指 ...

  2. Java学习笔记--Socket和ServerSocket

    参考资料: http://haohaoxuexi.iteye.com/blog/1979837http://zhidao.baidu.com/link?url=OeOSa0YbOzSbMVPa8sgP ...

  3. iOS 拨打电话三种方式总结

    1,这种方法,拨打完电话回不到原来的应用,会停留在通讯录里,而且是直接拨打,不弹出提示NSMutableString * str=[[NSMutableString alloc] initWithFo ...

  4. 关于栈和堆的定量分析(★firecat推荐★)

    文章来源:http://blog.csdn.net/bigbug_zju/article/details/39525281 计算机系统中的堆和栈是跟程序员最密切的两个概念.如果没有栈和堆的概念,下面程 ...

  5. BOT、BT、PPP形式介绍(3)

    PPP     20世纪90年代后,一种崭新的融资模式-PPP模式(Public-Private-Partnership,即“公共部门-私人企业-合作”的模式)在西方特别是欧洲流行起来,在公共基础设施 ...

  6. Hadoop:Task process exit with nonzero status of 1 异常

    在运行hadoop程序时经常遇到异常 java.io.IOException: Task process exit with nonzero status of 1.网上很多博文都说是磁盘不够的问题. ...

  7. 读书笔记:java特种兵(上)

    ----看着样章,感觉还不错,就买下来了,书先不论好坏,悟到了一个道理,东西没有好与坏,只有适不适合. 第一章:想了解编译器是如何优化程序的,当年的编译原理没有学好啊

  8. 解决Jenkins上git出现Timeout的问题

    Jenkins上现有的git插件并没有配置超时的选项,因此在clone项目时如果网络差会出现“ERROR: Timeout after 10 minutes”,导致无法继续构建. 网上找到一个解决方法 ...

  9. Annotation(三)——Spring注解开发

    Spring框架的核心功能IoC(Inversion of Control),也就是通过Spring容器进行对象的管理,以及对象之间组合关系的映射.通常情况下我们会在xml配置文件中进行action, ...

  10. python3-day4(递归)

    递归 特点 递归算法是一种直接或者间接地调用自身算法的过程.在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解. 递归算法解决问题的特点: (1) 递归就是在 ...