探讨HLS协议中TS格式的应用和SRS框架的TS包处理

FFmpeg开发实战:从零基础到短视频上线一书中介绍了音视频文件的封装格式,包括PS格式和TS格式。TS格式由于其固定长度的特性,使得TS流的任意片段都能独立解码,因此被广泛用作音视频文件的封装格式。

TS格式的独立解码特性也引入了HLS协议中,作为传输单元。HLS协议通过对大媒体的分片,并记录分片文件路径于m3u8文件中,使客户端能够根据m3u8文件获取分片列表并依次播放分片内容。每个TS分片以SPS与PPS等配置帧开头,指定视频规格信息及编码参数,确保每个TS片段能够正常解析播放。对SPS与PPS的详细说明可参见之前的文章《解析H.264码流中的SPS帧和PPS帧》。

对于MP4文件来说,当直播源来自MP4文件时,流媒体服务器又是如何将MP4文件转化为TS分片的呢?以SRS为例,它在组装TS包时进行特殊处理,自动在每个TS包的开头位置插入SPS与PPS等配置帧。

SRS框架处理TS包的示意图

在SRS框架的源码中,SrsIngestHlsOutput::on_ts_video函数中的代码片段展示了在写入H.264流时,先写入SPS帧和PPS帧,再写入I帧、P帧和B帧。

SRS框架的TS包处理示意图

随后,以SRS框架的定义为例,write_h264_sps_pps函数的内部代码依次输入SPS帧和PPS帧,确保每个TS包头部都有完整的SPS和PPS信息。

进一步跟踪mux_sequence_header的定义来源,详细的定义代码在SRS框架的trunk/src/protocol/srs_protocol_raw_avc.cpp中,SrsRawH264Stream::mux_sequence_header函数根据ISO_IEC_14496-15文档规范,先后写入了sequenceParameterSet的NAL单元(SPS帧)和pictureParameterSet的NAL单元(PPS帧)。

以上说明了SRS在每个TS包头都写入了SPS帧和PPS帧,确保TS包是拥有完整SPS和PPS信息的H.264分片。只有加入SPS与PPS,客户端才能正常拉流解析数据,才能正常渲染视频画面。

更多详细的FFmpeg开发知识请参见《FFmpeg开发实战:从零基础到短视频上线》一书。

标签:游戏攻略