网站开发项目中职责,wordpress相册插件nextgen gallery,postgre wordpress,用dw制作个人网页TS格式解析
简介#xff1a;
ts文件为传输流文件#xff0c;视频编码主要格式h264/mpeg4#xff0c;音频为acc/MP3。
ts的包是一个一个188字节的包组成#xff0c;这188字节里面由一个0x47开头的包作为同步。
也就是说#xff0c;如果你找到了0x47#xff0c;如果与它相…TS格式解析
简介
ts文件为传输流文件视频编码主要格式h264/mpeg4音频为acc/MP3。
ts的包是一个一个188字节的包组成这188字节里面由一个0x47开头的包作为同步。
也就是说如果你找到了0x47如果与它相隔188个字节的地方又是一个0x47基本上就是一个ts的包。
注ts包中有内容为0x47所以分割时确定是ts包之后直接以188字节分割。结构
ts文件分为三层ts层Transport Streamts层就是在pes层加入数据流的识别和传输必须的信息。pes层 Packet Elemental Streampes层是在音视频数据上加了时间戳等对数据帧的说明信息。es层 Elementary Stream.es层就是音视频数据。解析步骤
ts流 发送方式-PAT -PMT -PES -ES -ES -ES -ES -PES - ES -ES …
ts层的内容是通过PID值来标识的内容PAT表、PMT表、PES包、ES音频、视频。注只有PES包有pes header
解析ts流要先找到PAT表找到PAT就可以找到PMT的PID然后根据PMT的PID找到PES包,之后的为前一个PES包的补充ES数据。PAT表的table_id值固定为0x00。
PMT表的table_id值固定为0x02。
PES包的开始码固定为0x000001。
ES包开始即为数据没有固定值。ts header
ts层分为三个部分ts header:固定4个字节。adaptation field:可有可无作用是给不足188字节的数据做填充。payloadpes数据。ts header详解如下
字段长度(bite)描述sync_byte8b固定为0x47transport_error_indicator1b传输错误指示符表明在ts头的adapt域后由一个无用字节通常为0payload_unit_start_indicator1b负载单元起始标示符transport_priority1b传输优先级0为低优先级1为高优先级通常取0pid13bpid值transport_scrambling_control2b自适应区‘00’保留‘01’为无自适应域仅含有效负载‘10’为仅含自适应域无有效负载‘11’为同时带有自适应域和有效负载。自适应域adaptation fieldadaptation_field_control2bpid值continuity_counter4b递增计数器从0-f起始值不一定取0但必须是连续的
注payload_unit_start_indicator为1时表明是第一个的数据包 后面有pes层为0时表明不是第一个数据包后面直接是数据adaptation field
adaptation field详解如下
字段长度(字节)描述adaptation_field_length1B自适应域长度后面的字节数flag1B取0x50表示包含PCR或0x40表示不包含PCRPCR5BProgram Clock Reference节目时钟参考用于恢复出与编码端一致的系统时序时钟STCSystem Time Clock。stuffing_bytesxB填充字节取值0xff
PAT 格式
字段长度(bite)描述table_id8bPAT表固定为0x00section_syntax_indicator1b固定为1zero1b固定为0reserved2b固定为11section_length12b后面数据的长度section_length16b传输流ID固定为0x0001reserved2b固定为11version_number5b版本号固定为00000如果PAT有变化则版本号加1current_next_indicator1b为1表示这个PAT表可以用为0则要等待下一个PAT表section_number8b固定为0x00last_section_number8b固定为0x00program_number16b节目号为0x0001时,表示这是PMTreserved3b固定为111PID13b节目号对应内容的PID值CRC3232b前面数据的CRC32校验码
注ts header之后PAT表之前有1字节无用需要排除
PMT格式
字段长度(bite)描述table_id8bPAT表固定为0x02section_syntax_indicator1b固定为1zero1b固定为0reserved2b固定为11section_length12b后面数据的长度section_length16b频道号码表示当前的PMT关联到的频道取值0x0001reserved2b固定为11version_number5b版本号固定为00000如果PMT有变化则版本号加1current_next_indicator1b为1表示这个PMT表可以用为0则要等待下一个PAT表section_number8b固定为0x00last_section_number8b固定为0x00reserved83b固定为111PCR_PID13bPCR(节目参考时钟)所在TS分组的PID指定为视频PIDreserved4b固定为1111program_info_length12b节目描述信息指定为0x000表示没有stream_type8b流类型h.264编码对应0x1baac编码对应0x0fmp3编码对应0x03,h.265编码对应0x24reserved3b固定为111elementary_PID13b与stream_type对应的PIDreserved4b固定为1111ES_info_length12b描述信息指定为0x000表示没有CRC3232b前面数据的CRC32校验码
注ts header之后PMT表之前有1字节无用需要排除
PES格式
字段长度(字节)描述pes_start_code3B开始码固定为0x000001stream_id1B音频取值0xc0-0xdf通常为0xc0;视频取值0xe0-0xef通常为0xe0pes_packet_length2B后面pes数据的长度0表示长度不限制只有视频数据长度会超过0xffff(注长度为整个pes即为第一个pes头、es之后的es)flag1B通常取值0x80表示数据不加密、无优先级、备份的数据flag1B取值0x80表示只含有pts取值0xc0表示含有pts和dtspes_data_length1B后面数据的长度取值5或10pts5B33bit值dts5B33bit值
注 pts是显示时间戳、dts是解码时间戳视频数据两种时间戳都需要音频数据的pts和dts相同所以只需要pts。
有pts和dts两种时间戳是B帧引起的I帧和P帧的pts等于dts。如果一个视频没有B帧则pts永远和dts相同。从文件中顺序读取视频帧取出的帧顺序和dts顺序相同。
dts算法比较简单初始值 增量即可pts计算比较复杂需要在dts的基础上加偏移量。ES格式
视频数据必须加上一个naluNetwork Abstraction Layer unitnalu包括nalu header和nalu type.
nalu header固定为0x00000001帧开始,常见或0x000001帧中。nalu header
字段长度(bite)forbidden_zero_bit1bnal_unit_type6bnuh_reserved_zero_6bits6bnuh_temporal_id_plus13b
H265 帧类型判断 在文件中查找00 00 00 01NALU头发现在有6种开头分别为
00 00 00 01 40 01 的nuh_unit_type的值为 32 语义为视频参数集 VPS
00 00 00 01 42 01 的nuh_unit_type的值为 33 语义为序列参数集 SPS
00 00 00 01 44 01 的nuh_unit_type的值为 34 语义为图像参数集 PPS
00 00 00 01 4E 01 的nuh_unit_type的值为 39 语义为补充增强信息 SEI
00 00 00 01 26 01 的nuh_unit_type的值为 19 语义为可能有RADL图像的IDR图像的SS编码数据 IDR
00 00 00 01 02 01 的nuh_unit_type的值为1 语义为被参考的后置图像且非TSA、非STSA的SS编码数据