相关的数据结构
下面介绍HLSDownloader中和HLS协议相关的一些数据结构,它们的关系需要参考下面的图
如果不存在Master PlayList,那么它是下面的形式
Master PlayList
Master PlayList也叫做一级索引,它里面存放了Media PlayList的信息,对照下面的实例进行分析会比较好理解
#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1064000
1000kbps.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=564000
500kbps.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=282000
250kbps.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=2128000
2000kbps.m3u8
bandwidth指定视频的比特率;
PROGRAM-ID无需关注;
每个#EXT-X-STREAM-INF的下一行就是二级index文件的路径,路径可以是绝对路径也可以是相对路径;
客户端可以自己判断目前的网络带宽,来决定播放哪一个视频流
// Master PlayList,也就是一级索引
struct hls_master_playlist {
char *url; // PlayList的URL
char *source;
int count; // Media PlayList的数量
struct hls_media_playlist *media_playlist;
};
Media PlayList
Media PlayList也叫做媒体索引文件、或者二级索引文件,它里面存放了TS媒体文件的信息,对照下面的实例进行分析会比较好理解
#EXTM3U
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-TARGETDURATION:10
#EXTINF:10,
2000kbps-00001.ts
#EXTINF:10,
2000kbps-00002.ts
#EXTINF:10,
2000kbps-00003.ts
#EXTINF:10,
2000kbps-00004.ts
... ...
#EXTINF:10,
2000kbps-00099.ts
#EXTINF:10,
2000kbps-00100.ts
#ZEN-TOTAL-DURATION:999.66667
#ZEN-AVERAGE-BANDWIDTH:2190954
#ZEN-MAXIMUM-BANDWIDTH:3536205
#EXT-X-ENDLIST
#EXTINF表示每个ts切片的视频文件的时长
#EXT-X-TARGETDURATION指定当前视频流中切片文件的最大时长,即这些ts切片的时长不能超过这个值
#EXT-X-PLAYLIST-TYPE-VOD 表示当前的视频不是一个直播流,而是点播流
#EXT-X-ENDLIST表示这个视频结束,这个标志也说明了当前的流是一个非直播流
// Media PlayList,也就是二级索引文件,或者媒体索引文件
struct hls_media_playlist {
char *url;
char *source;
unsigned int bitrate; // 比特率
bool encryption; // 是否加密
int encryptiontype; // 加密的类型
int count; // TS文件的数量
int target_duration; // 所有的TS文件的时长总和
struct hls_media_segment *media_segment; // TS文件
struct enc_aes128 enc_aes; // 安全密钥
hls_media_playlist():media_segment(NULL),url(NULL),source(NULL){
}
};
TS媒体文件信息
// TS媒体片段的信息
struct hls_media_segment {
std::string url; // URL
int sequence_number; // 序号
struct enc_aes128 enc_aes; // 加密信息
//std::shared_ptr<ByteBuffer> seg;
hls_media_segment(){
}
};