原因:上篇博客简单分析了一下FFmpeg针对HLS拉流的简单流程,其中可知重点为m3u8文件的获取以及解析,故在此分析m3u8文件格式。
概述:用户通过RTMP协议将数据流推送到服务器,在服务器中通过转码器将RTMP协议转换成HLS协议,随后用户通过HLS协议进行拉流观看,转换成HLS的原因主要考虑为HLS的ABR切换,这就需要每个分片的起始的IDR帧在PTS上面必现要对齐如下:不同的分辨率对应不同的码率,但是每个切片的起始IDR的PTS必现对齐.
使用HLS直播过程中延迟也比较大,一般10s左右,HLS的延迟主要由如下构成:
延迟=生成一个切片的时长 +(0-1个)td(td=EXT-X-TARGETDURATION,简单理解为客户端获取切片的时间间隔)+(0-n个)启动切片(苹果官方推荐生成3个切片后才开始播放,一般2个切片即可)+客户端拉流播放延迟.
在解决延迟问题上看到有人提出了使用http中的Transfer Encoding:chunked属性,这样可以在ts没有完全切片完成时可以先播放切片完成的数据。这里就涉及到了http的长连接问题,另开博客。
回归原题,m3u8就是HLS协议的一部分,m3u8就是用UTF-8编码的m3u文件,该文件由苹果公司提出,主要用于HLS(HTTP LIVE Streaming)实时流传输协议中。用户通过m3u8文件获取到特定的数据流然后进行拉流等其他操作。