HLS 学习

m3u8 笔记:


在IOS device和mac上可以用http的方式进行分发,其中playlist标准为由m3u扩展而来的m3u8文件,媒体文件为MPEG2-TS或者AAC文件(audio only)。


m3u8文件有两种应用场景:
multi bitrate adaptive streaming
#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1280000
http://example.com/low.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=2560000
http://example.com/mid.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=7680000
http://example.com/hi.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=65000,CODECS="mp4a.40.5"
http://example.com/audio-only.m3u8
sbr bitrate adaptive streaming
#EXTM3U
#EXT-X-TARGETDURATION:5220
#EXTINF:5220,
http://media.example.com/entire.ts
#EXT-X-ENDLIST
 
 
rfc doc:
http://tools.ietf.org/html/draft-pantos-http-live-streaming-06
m3u8 文件是m3u文件的扩展。在该rfc中定义了扩展的关键字:
其中:
#EXT-X-TARGETDURATION
定义每个TS的最大的duration。
#EXT-X-MEDIA-SEQUENCE
定义当前m3u8文件中第一个文件的序列号,每个ts文件在m3u8文件中都有固定唯一的序列号,该序列号用于在MBR时切换码率进行对齐。
#EXT-X-KEY
定义加密方式和key文件的url,用于取得16bytes的key文件解码ts文件。
属性:
METHOD
URL
#EXT-X-PROGRAM-DATE-TIME
第一个文件的绝对时间
#EXT-X-ALLOW-CACHE
是否允许cache。
#EXT-X-ENDLIST
表明m3u8文件的结束。live m3u8没有该tag。
#EXT-X-STREAM-INF
属性:
BANDWIDTH
PROGRAM-ID
CODECS
#EXT-X-DISCONTINUITY
当遇到该tag的时候说明以下属性发生了变化:
file format 
number and type of tracks
encoding parameters
encoding sequence
timestamp sequence
#EXT-X-VERSION
-------------------------------------------------------------------------------------




MPEG2-TS是一种封装格式,所有的video,audio以及辅助信息(PAT,PMT)都被封装成为188bytes的TS_packet.在TS中用PID来区分不同的stream.其中有一些特殊的PID,如PAT的pid固定是0x0000.
标准是:iso13818-1
优点是每个包都有固定大小,在网络传输中和文件切割时比较方便;
缺点是因为每个包都是188bytes,所以必然会有padding;从而浪费一定的空间,当sample比较小的时候浪费是比较严重的,此时能够通过将多个sample压缩进行打包的方式来实现。
在http live streaming中只需要实现部分标准。
PSI(program specific information)信息:
PAT(program_association_table):是由program_association_section构成。
每个PAS的结构如下图所示:


由上图可以看出PAS用来指定program_map_pid和network PID。对于m3u8 streaming 中network PID 并不需要实现。


PMT(program_map_table):用来指定每个节目中有几路es stream,其中每个stream的PID以及一些相关的描述信息。


PES_packet():用来打包es的格式。其中比较重要的信息有DTS、PTS信息。详细信息请查阅iso13818-1标准。
TS_packet(transport_packet):用来打包PES_packet和PSI信息。
在MPEG2-TS中PID是一个很重要的概念,PID是流的唯一标示符,相同的PID指定的是相同类型的内容。服务器和客户端端是通过PID来实现复用和解复用的。
客户端的解码过程:
1.找到TS_packet的开始位0x47。
3.找到PID为0x0000的PAT,将PAT进行解包,得到每路节目对应的PMT PID(在m3u8 streaming中只有一路节目)。
4.根据PAT解包得到的PMT PID得到PMT,同理将PMT进行解包得到ES pid和对应的类型。
5.根据PMT解包得到的ES PID,将该路流解包得到PES_packet,从而得到ES流和DTS,PTS。此时就能送到decoder去解码了。
服务器端的编码过程:
1.更具PMT PID来生成PAT,并打包成TS_packet来写入文件。
2.根据ES的PID和类型生成PMT,并打包成TS_packet来写入文件。
4.接收video/audio sample,并将一个或者多个sample打包成为PES_packet.
5.将打包好的PES_packet封装成TS_packet写入文件。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值