TS科普10 自适应字段

adaptation_field_length — adaptation_field_length 为指定紧随adaptation_field_length 的adaptation_field中的字节数的8 比特字段。0 值表示传输流包中插入单个填充字节。当adaptation_field_control 值为‘11’时,adaptation_field_length 值必须在0 到182 的区间内。当adaptation_field_control 值为‘10’时,adaptation_field_length 值必须为183。对于承载PES 包的传输流包,只要存在欠充足的PES 包数据就需要通过填充来完全填满传输流包的有效载荷字节。填充通过规定自适应字段长度比自适应字段中数据元的长度总和还要长来实现,以致于自适应字段在完全容纳有效的PES 包数据后,有效载荷字节仍有剩余。自适应字段中额外空间采用填充字节填满。
这是承载PES 包的传输流包所允许的唯一填充方法。对于承载PSI 的传输流包,可供选择的填充方法在2.4.4 中描述。

PCR_flag — PCR_flag 为1 比特标志。‘1’值指示adaptation_field 包含以两部分编码的PCR 字段。‘0’值指示自适应字段不包含任何PCR 字段。

program_clock_reference_base; program_clock_reference_extension — rogram_clock_reference
(PCR) 为以两部分编码的42 比特字段。第一部分,program_clock_reference_base 为33 比特字段,其值由PCR_ base (i)给出,如公式2-2 中给出的。第二部分,rogram_clock_reference_extension 为9 比特字段,其值由PCR_ext(i) 给出,如公式2-3 中给出的。PCR 指示包含program_clock_reference_base 最后比特的字节到达系统目标解码器输入端的预期时间。

中间部分详见H.222标准文档

stuffing_byte — 此为固定的8 比特值等于‘1111 1111’,能够通过编码器插入。它亦能被解码器丢弃。


<think>好的,用户的问题是关于使用Python实现HEVC视频流打包成MPEG-TS的详细代码,包含TS头、PAT、PMT、PES封装,自适应字段填充和CRC校验等细节。这需要比较深入的多媒体处理知识,特别是对MPEG-TS格式的理解。 首先,我需要回顾MPEG-TS的结构。TS流由188字节的包组成,每个包包括头部和有效载荷。用户提到的TS头、PAT、PMT、PES封装都是关键部分。PAT(Program Association Table)和PMT(Program Map Table)是PSI(节目特定信息)的重要组成部分,用于描述节目和流的关系。PES(Packetized Elementary Stream)则是将基本流(如HEVC视频)分装成包的结构。 接下来,用户需要自适应字段填充,这可能涉及到调整包的大小,或者在有效载荷不足时填充字节。CRC校验则是确保数据完整性的部分,通常用于PSI表的部分,比如PAT和PMT表。 然后,我需要考虑如何在Python中实现这些结构。由于Python处理字节操作可能需要使用struct模块来打包二进制数据,并且需要处理位级别的操作,比如各种标志位的设置。同时,HEVC的编码数据需要被封装成PES包,再分割成TS包的有效载荷部分。 用户可能遇到的挑战包括正确构建各个表的结构,处理CRC计算,以及处理时间戳(PTS/DTS)的生成。此外,自适应字段的处理需要根据具体情况调整,比如当数据不足时填充字节,或者插入特定的字段。 关于代码示例,用户可能需要一个基础的框架,展示如何生成TS头、PAT、PMT、PES包,并进行CRC校验。需要注意的是,Python在处理实时视频流时可能效率不高,但对于学习或原型开发来说是可行的。此外,可能需要引用现有的库或工具,比如FFmpeg的相关实现,来验证CRC计算或结构是否正确。 最后,用户可能还需要了解相关的标准文档,如MPEG-2 Transport Stream标准,以及HEVC的封装规范,以确保代码的正确性。同时,生成相关问题可以帮助用户进一步学习,比如性能优化、错误处理等。</think>以下是使用Python实现HEVC视频流打包成MPEG-TS的框架代码及关键技术解析: ### 一、MPEG-TS封装核心要素 1. **TS包结构**:每个TS包固定188字节,包含: - 4字节头部:同步字节(0x47)、PID标识、自适应字段控制等 - 自适应字段(可选) - 有效载荷数据 2. **节目关联表(PAT)**:PID固定为0x0000,映射节目号与PMT的PID 3. **节目映射表(PMT)**:定义节目包含的流类型(HEVC对应stream_type=0x24[^3]) 4. **PES封装**:将HEVC NALU封装为PES包,需包含PTS/DTS时间戳 ### 二、Python实现代码框架 ```python import struct import zlib def create_ts_header(pid, continuity_counter, payload_unit_start=0): sync_byte = 0x47 transport_error_indicator = 0 transport_priority = 0 adaptation_field_control = 0x01 # 无自适应字段 return struct.pack('>BBH', sync_byte, (transport_error_indicator <<7) | (payload_unit_start <<6) | (transport_priority <<5) | ((pid >>8) & 0x1F), (pid & 0xFF) <<8 | (adaptation_field_control <<4) | continuity_counter ) def create_pat(program_number=1, pmt_pid=0x1000): pat_data = struct.pack('>HHH', 0x0000, # transport_stream_id 0xB0, # 0xB0固定值 ((program_number & 0xFFFF) <<16) | 0xE000 | (pmt_pid & 0x1FFF) ) crc = zlib.crc32(pat_data) & 0xFFFFFFFF return pat_data + struct.pack('>I', crc) def create_pmt(hevc_pid=0x1001): pmt_data = struct.pack('>HHBBH', 0x0002, # program_number 0xB0, # 固定值 0x00, # version 0x1B, # stream_type HEVC (hevc_pid & 0x1FFF) | 0xE000 ) crc = zlib.crc32(pmt_data) & 0xFFFFFFFF return pmt_data + struct.pack('>I', crc) def create_pes_packet(data, pts): pes_header = struct.pack('>BBHBBBBBBB', 0x00, 0x00, 0x01, # start code 0x21, # stream_id (video) 0x00, 0x00, # pes_packet_length 0x84, # flags (PTS only) 0x05, # pes_header_data_length (pts >> 29) & 0x0E, (pts >> 22) & 0xFF, (pts >> 14) & 0xFE, (pts >> 7) & 0xFF, (pts << 1) & 0xFE ) return pes_header + data ``` ### 三、关键技术实现 1. **自适应字段填充**:当有效载荷不足184字节时需填充 ```python def add_adaptation_field(ts_packet, stuff_bytes): adaptation_field = struct.pack('>BB', len(ts_packet) - 4 + 1, # adaptation_field_length 0x00 # flags ) + b'\xFF'*stuff_bytes return ts_packet[:3] + bytes([ts_packet[3] | 0x20]) + adaptation_field ``` 2. **CRC32校验**:用于PSI表的校验计算[^1] ```python def calculate_crc(data): return zlib.crc32(data) & 0xFFFFFFFF ``` 3. **HEVC NALU处理**:需添加起始码`0x00000001`并分割为PES包 ### 四、应用示例 ```python # 生成TS流示例 output = bytearray() continuity_counter = 0 # 添加PAT表 pat = create_pat() output += create_ts_header(0x0000, continuity_counter) + pat continuity_counter = (continuity_counter + 1) % 16 # 添加PMT表 pmt = create_pmt() output += create_ts_header(0x1000, continuity_counter) + pmt continuity_counter = (continuity_counter + 1) % 16 # 添加HEVC视频数据 hevc_data = b'\x00\x00\x00\x01\x26\x01...' # HEVC NALU pes = create_pes_packet(hevc_data, pts=90000) ts_packet = create_ts_header(0x1001, continuity_counter) + pes[:184] output += ts_packet ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值