HLS媒体流简要

HLS媒体流简要

HLS是HTTP Live Streaming的缩写。是起初是由苹果公司的提出,后来成为了一种标准。标准草案文档连接

https://tools.ietf.org/html/draft-pantos-http-live-streaming-13

还有苹果官方的文档:

https://developer.apple.com/streaming/

 

其主要思想就是

将媒体流(文件)分解成一个一个很小的ts流文件,并且在一个列表文件(m3u8文件)中列出这些ts,然后通过http发送这些一个ts流小文件给客户端。

3个关键点

  • 文件列表
  • ts小文件
  • http协议

采用http的缘故就是因为http采用的是80端口,可以无障碍的穿透任何的防火墙。

文件列表文件是一个m3u8为后缀的文件,下面列出一个由ffmpeg生成的m3u8的文件,来说明其文件格式

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:9
#EXT-X-MEDIA-SEQUENCE:169
#EXTINF:2.435767,
out1.ts
#EXTINF:2.435767,
out2.ts
#EXTINF:1.267933,
out3.ts
#EXTINF:6.439767,
out4.ts
#EXTINF:8.341667,
out5.ts
#EXTINF:5.538867,
out6.ts
#EXTINF:5.171833,
out7.ts
#EXTINF:5.205200,
out8.ts
#EXTINF:5.905900,
out9.ts
#EXTINF:3.403400,
out10.ts
#EXT-X-ENDLIST

 

下面简单解释一个上面文件中各个指示符代表的意义:

EXTM3U –   代表文件的格式
EXT-X-VERSION 3  文件的版本
EXT-X-TARGETDURATION 9  目标的ts文件的大小,所有的ts文件的时间长度必须小于等于它
EXT-X-MEDIA-SEQUENCE 169  整个媒体流有多少个ts小文件
EXTINF 2.435767  当前的ts文件的长度(时间)

 

我们看到每个ts文件的大小不一样,这是因为每个ts的保证都是可以单独播放,也就是ts的第一帧保证是关键帧。

 

如何用ffmpeg生成hls流

按照前面的解释,hls就是一个m3u8的列表文件,和一个个的ts小文件。

$ ffmpeg -i test.mp4 test.m3u8

执行上面的这个命令后,你会发现在当前目录下面生成了一个test.m3u8文件,并且一些列的ts为后缀的文件。

但是我们会发现test.m3u8这个文件中并不是列出了所有的ts的文件,而是只有最后的5个ts文件,

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:6
#EXT-X-MEDIA-SEQUENCE:288
#EXTINF:5.538867,
test288.ts
#EXTINF:5.171833,
test289.ts
#EXTINF:5.205200,
test290.ts
#EXTINF:5.905900,
test291.ts
#EXTINF:3.403400,
test292.ts
#EXT-X-ENDLIST

这是默认是ts个数,想要控制这个数字,可以通过参数

-hls_list_size

来设置

每个ts流的时间长度通过

-hls_time

来设置。

下面是一个完整的生成hls流的命令

$ ffmpeg -i tom-jerry.mp4 -f hls -hls_time 5 -hls_list_size 20 -an out.m3u8

 

有了这个m3u8文件,就通过vlc或者ffplay来播放视频了,不过要注意的是,这个文件中指定哪些个ts文件,就会播放哪些文件。

 

更过关于ffmpeg的hls的选项,请参看官方的文档:

http://ffmpeg.org/ffmpeg-formats.html#hls-1

 

 

版权所有,禁止转载. 如需转载,请先征得博主的同意,并且表明文章转载自:IT夜班车,否则按侵权处理.

    分享到:

Leave a Reply

Your email address will not be published. Required fields are marked *