SRT协议封装MPEG-TS 流的视频和音频PES头结构

PES(Packetized Elementary Stream,分组化基本码流)头部是 MPEG-TS 封装中的关键部分,位于 TS 包的负载中,承载了音视频帧的解码和显示时间戳(PTS/DTS)等核心信息。

音频典型 PES 头:14 字节(仅 PTS),视频典型 PES 头:19 字节(PTS + DTS)

字段详细说明
  1. packet_start_code_prefix (3 字节)
  • 固定值:0x00 0x00 0x01

  • 作用:PES 包起始标志

  1. stream_id (1 字节)

标识负载的类型:

值范围 类型 示例
0x80-0x9F 视频流 0xE0 常用于 H.264/H.265
0xC0-0xDF 音频流 0xC0 用于 MPEG 音频
0xBC 节目流目录
0xBD DVD 私有流
0xBE 填充流
0xBF 私有流 2
  1. PES_packet_length (2 字节)
  • 值:PES 头部长度 + 负载长度

  • 特殊值:0 表示 PES 包长度未指定,PES 包将持续到流结束

  1. 标志位 (2 字节,字节6-7)

字节6 (bits 0-7):

比特 字段 长度 说明
0-1 PES_scrambling_control 2 00=未加扰,01=保留,10=偶数密钥,11=奇数密钥
2 PES_priority 1 1=高优先级
3 data_alignment_indicator 1 1=PES 包与访问单元对齐
4 copyright 1 1=有版权
5 original_or_copy 1 1=原始,0=拷贝
6-7 PTS_DTS_flags 2 00=无 PTS/DTS,10=仅 PTS,11=PTS+DTS

字节7 (bits 8-15):

比特 字段 长度 说明
0-1 ESCR_flag 2 01=包含 ESCR
2 ES_rate_flag 1 1=包含 ES 速率
3 DSM_trick_mode_flag 1 1=包含特技模式
4 additional_copy_info_flag 1 1=包含附加拷贝信息
5 CRC_flag 1 1=包含 CRC
6 extension_flag 1 1=包含扩展字段
7 PES_header_data_length 8 可选字段长度(实际在字节7的低8位?需确认)

注意 :标准中,PES_header_data_length 独占字节 8,标志位在字节 6 和字节 7 的高位。

  1. PES_header_data_length (1 字节)
  • 作用:指明其后 optional_fields + stuffing_bytes 的总长度

  • 最小值:0x05(当有 PTS 时)

  1. 可选字段 (optional_fields)

当 PTS_DTS_flags 不为 00 时,包含以下内容:

PTS_DTS_flags 包含内容 总长度
10 PTS (5 字节) 5 字节
11 PTS (5 字节) + DTS (5 字节) 10 字节

视频帧含pts

复制代码
00 00 01 E0 00 00 80 80 05 21 00 04 12 05 22 00 04 12 ...
字节 值 字段 说明
0-2 00 00 01 packet_start_code_prefix 起始码
3 E0 stream_id 视频流
4-5 00 00 PES_packet_length 未指定长度
6 80 标志位高8位 1000 0000 → PTS_DTS_flags=10
7 80 标志位低8位 1000 0000 → 各 flag 为 0
8 05 PES_header_data_length 可选字段长度 = 5
9-13 21 00 04 12 05 PTS (5字节) 解码时间戳
14+ ... 负载 视频数据

音频帧含pts

复制代码
00 00 01 C0 00 20 80 80 05 21 00 04 12 05 ...
字节 值 字段 说明
0-2 00 00 01 packet_start_code_prefix 起始码
3 C0 stream_id 音频流
4-5 00 20 PES_packet_length 32 字节
6 80 标志位高8位 PTS_DTS_flags=10
7 80 标志位低8位
8 05 PES_header_data_length 5 字节
9-13 21 00 04 12 05 PTS
14+ ... 负载 音频数据

第一帧视频为什么要加AUD 4 字节

第一帧视频加 AUD(Access Unit Delimiter,访问单元分隔符) 的核心原因是:为解码器明确标识一个视频访问单元的起始边界,并携带关键的类型信息,以确保解码器能正确解析后续的 NALU。

这 4 字节不是必需的,但加入 AUD 可以提高视频流的兼容性和鲁棒性,尤其在 MPEG-TS 这种需要频繁随机接入的场景中。

AUD 是一个特殊的 NALU(Network Abstraction Layer Unit),其结构非常简单:

起始码:0x00 0x00 0x00 0x01,标识 NALU 的开始

nal_unit_type = 9:标识这是一个 AUD

primary_pic_type:3 bits,表示后续图像的类型(I/P/B 等)


AUD作用:

AUD 的 3 bits primary_pic_type 告诉解码器该帧的基本类型

解码器无需解析后面的 slice 头就能知道这一帧的类型,有助于快速决策(如丢帧策略、参考帧管理)

相关推荐
VidDown12 小时前
从视频画面里提取文字:OCR、文字检测与结构化输出
python·网络协议·ocr·音视频·视频编解码·视频
音视频牛哥13 小时前
一帧视频的底层工程:像素格式、内存带宽、GPU 与 AI
音视频·像素格式·yuv rgb·nv12 nv21·rgb565·rtsp yuv·rtmp rgb
VidDown14 小时前
文件没问题但网页播不了:播放器接入实战与那些“环境问题
python·网络协议·音视频·视频编解码·视频
the3clipse14 小时前
视频编码技术如何赋能游戏性能优化:从硬件隔离到AI驱动的带宽革命
游戏·性能优化·音视频·视频编码·硬件加速·ai编码·自适应编码
I Am a robert girl14 小时前
打破音频生态壁垒:用 WinAirCast 把 Windows 声音塞进 HomePod
windows·音视频·跨平台开发·音频串流·airplay 2·homepod
揽秀亭长14 小时前
视频转脚本有哪些技术路线?三种常见方案对比分析
人工智能·音视频
VidDown15 小时前
从一堆脚本到能维护的系统:视频处理管道的工程化
服务器·ffmpeg·音视频·视频编解码
轻口味16 小时前
HarmonyOS 7 新特性2:音频编创——轻音台里的降噪、环绕与格式转换
华为·音视频·harmonyos·鸿蒙·音频编创
技灵AI16 小时前
Seedance 长剧生产实战:用首尾帧接戏解决角色崩脸与场景漂移(含 return_last_frame 用法与提示词模板)
人工智能·prompt·aigc·音视频
2601_9623811318 小时前
做城市历史视频时,AI 自动生成变迁动效的实现路径拆解
人工智能·音视频