rtmp协议是adobe出的一种流媒体格式协议。是目前较为流行的协议的一种。
HLS协议是苹果推出的一种流媒体协议,由于IOS系统不支持RTMP协议,如实现RTMP协议的流媒体需要自己实现RTMP的客户端,这使得移动手机端使用RTMP的流媒体增加了一些开发成本。
HLS协议的详情可以参考APPLE的网站,内容主要由M3U8和MPEGTS这两大文件组成,本文详解的是MPEGTS文件。
MPEG2-TS(Transport Stream“传输流”;又称 MTS、TS)是一种传输和存储包含音效、图像与通信协议各种数据的标准格式,用于数字电视广播系统,如 DVB、ATSC、IPTV 等等。
MPEG2-TS 定义于 MPEG-2 第一部份,系统(即原来之 ISO/IEC 标准 13818-1 或 ITU-T Rec. H.222.0)。
SMPLAYER、VLC多媒体播放器 等软件可以直接播放 MPEG-TS 文件。
MPEG2-TS传输流编码层允许一个或多个节目组合成单一流。来自每个基本流的数据同节目内允许该基本流同步显示的信息一起多路复用。
传输流由一个或多个节目组成。音频和视频基本流(ES)由存取单元(AU,一般常说的NALU)组成。
基本流数据(ES element stream , 比如H264裸流)在PES 包中承载。PES 包由PES 包头及后随的包数据组成。PES 包插入到传输流包中。每个PES 包头的首字节定位于传输流包的第一个有效载荷位。
本文主要的参考为:ISO-13818-1,Adobe Flash Video File Format Specification Version 10.1,ISO-14496-3,ISO-14486-15
本文所述内容与标准有一定的差异,这种差异并非指存在违背标准的内容,而是本文由于篇幅所限,对于某些约束,只取与符号标准的一项,而不是兼容标准所有的规范。
1.2结构
传输流类似OSI network 协议堆栈:
1.TS
2. PES
3.Elementarystream (ES) — audio or video (the below is for video only)
4.编码层..
1.3传输流数据包(transport stream packets)
TransportStream packets -> PES -> ES
TransportStream packets 是传输流(transport stream)内数据的最基本单位,包含了一个同步字节(sync byte)值为 0x47,它存在一个4bytes的固定包头,32bits 接着它的是可变包头区域。 Packets 有固定的188 bytes 的长度。
表1-1 Transport Stream packets结构
字段 |
Value |
bits |
|
sync_byte |
0x47 |
8 |
bslbf |
transport_error_indicator |
如果这个流中包含了一个无法修复的错误,由解调器设置,以告诉多路解调器,该包存在一个无法纠正的错误 |
1 |
bslbf |
payload_unit_start_indicator |
1 表示是 PES 数据或 PSI数据的开始部分,否则为零. |
1 |
bslbf |
transport_priority |
1 意思是在相同 PID 的数据包中含有更高的优先权. |
1 |
bslbf |
PID |
PID 为13 比特字段,指示包有效载荷中存储的数据类型,也就是包的标识号。 |
13 |
uimsbf |
transport_scrambling_control |
此2 比特字段指示传输流包有效载荷的加扰方式。 |
2 |
bslbf |
adaptation_field_control |
此2 比特字段指示此传输流包头是否后随自适应字段和/或有效载荷 |
2 |
bslbf |
continuity_counter |
continuity_counter 为4 比特字段,随着具有相同PID 的每个传输流包而增加 |
4 |
uimsbf |
|
|
|
|
这里最主要关系的是payload_unit_start_indicator,PID,adaptation_field_control,continuity_counter
payload_unit_start_indicator
这个位标志为1,指的是一个包的启示,因为ts包只有188个字节,对于一个PES包的话往往大于188字节,因此一个PES包往往要拆成多个TS包,为了识别收到的TS包属于另一个PES包,起始位表示新的一个PES包或者PSI包等到来了。
PID program id
节目标示符,一个13位的无符号整数。作用如下表描述。一般来说,参考FFMPEG,PMT表使用PID 4096,VIDEOSTREAM 采用256,AUDIOSTREAM采用257。