【音视频】H265-NALU-AVpacket-PS-RTP(GB28181)

概述

国标平台的推流与直接使用RTSP或者RTMP推流的方法不同,需要先从H265格式的流地址中解析出来NALU(直接使用FFmpeg库或者自己构建一个小型的RTSP服务器实现),然后对不同类型的NALU进行处理,H265视频中的NALU类型主要有VPS SPS PPS 以及I帧等,需要将其组装成PS流然后通过RTP封包发送。

本文主要讨论这个流程实现RTP打包的可行性,具体代码实现后面总结实现

PS流

通过H265视频流解码出来NALU,然后通过NALU封装成PS流的过程,在推流过程中PS流起到很大的作用,所以首先讨论PS流

MPEG PS 标准

Program Stream (PS):MPEG PS 是一种 面向节目 (Program-oriented) 的复用格式,主要用于 存储系统层处理 单个节目 (例如电影, 电视节目)。 它被设计为在 可靠的存储介质 (例如 DVD, 硬盘) 上使用,对错误鲁棒性要求不高

PES Packet (Packetized Elementary Stream Packet): PS 流的基本组成单元是 PES Packet。 每个 PES Packet 封装了 来自一个基本码流 (Elementary Stream, ES) 的数据,例如一个视频帧或一段音频数据

  • PES的组成
    • PES Header:也就是说每个PES包都会有一个Header,其中包含了元数据信息,例如 Stream ID (标识音视频流类型), PES Packet 长度, PTS/DTS 时间戳等
    • PES Payload: PES Header 后面紧跟着 PES Payload,包含了实际的音视频数据 (也就是类似于 H.265 NALU 数据)

    • 所以在具体代码的实现中需要将NALU打包成PES,然后再进一步打包成PS流,然后通过RTP发送出去

Stream ID:PES Header 中的 Stream ID 用于 标识 PES Packet 所属的基本码流

  • 0xE0 到 0xEF: 视频流 (Video Stream)
  • 0xC0 到 0xDF: 音频流 (Audio Stream)
  • 0xBD: Private Stream 1 (私有流 1),可以用于封装其他类型的数据

PTS (Presentation Time Stamp) 和 DTS (Decoding Time Stamp)

  • 时间戳信息,主要就是用于音视频同步和解码顺序控制
  • PTS表示的时显示时间戳,DTS表示的则是解码时间戳

System Header: PS 流的 系统头信息,包含了整个 PS 流的 全局参数,例如 码率限制 (Rate Bound), 缓冲区大小限制 (VBV Buffer Size Bound), 系统时钟参考 (System Clock Reference, SCR) 等。 System Header 通常在 PS 流的开头出现

  • 具体代码实现中要将SYS头放到PS流的开头,也就是最后再封装

Program Stream Map (PSM): PSM 是 PS 流的 节目映射表,包含了 PS 流中 所有基本码流 (音视频流)描述信息,例如 Stream Type, Elementary Stream ID 等。 解码器需要 PSM 来 识别和解析 PS 流中的音视频数据。 PSM 通常在 System Header 之后出现

下面是基于上述总结,具体结构参考下文

探究ISO/IEC 13818-1Clause 2.4 Program Stream 章节内容

 PS流的主要特点

  • PS流设计用于复用单个节目(类似于电影或者电视节目)的数据,其与TS面向传输不同,PS更侧重于存储和系统层的处理
  • 可变长度包: PS 使用可变长度的 PES Packet,这使得 PS 格式更加灵活,可以适应不同类型和大小的音视频数据

  • 适用于可靠介质: PS 主要设计用于 可靠的存储介质,例如光盘 (DVD, Blu-ray) 和硬盘。 它 对错误鲁棒性要求不高,因为假定存储介质是可靠的,数据传输过程中不易出错

  • 单个时间基准: PS 中的所有基本码流 (音视频流) 共享 同一个时间基准 ,简化了同步和解码器的实现

PS的复用

  • PES Packet交织:PS一般通过将来自不同基本码流(类似于视频ES或者音频ES)的PES Packet交织起来,从而形成一个单一连续的码流。交织在一起的目的是为了实现音视频的同步播放
  • 既然交织在一起,其通过时间戳实现同步,也就是上面提到DTS和PTS

PS的主要组成(重点)

  • Packet Start Code Prefix (分组起始码前缀): 每个 PS 语法元素的开始都以 4 字节的 0x00 0x00 0x01 起始码前缀开始,用于标识语法元素的类型

  • System Header (系统头): 全局头信息,描述了整个 PS 流的系统级参数,例如 码率限制 (Rate Bound), 缓冲区大小限制 (VBV Buffer Size Bound), 系统时钟参考 (SCR) 等。 System Header 通常在 PS 流的开头出现

  • Program Stream Map (PSM): 节目映射表,包含了 PS 流中 所有基本码流 (音视频流)描述信息,例如 Stream Type (流类型), Elementary Stream ID (基本流 ID) 等。 解码器需要 PSM 来识别和解析 PS 流中的音视频数据。 PSM 通常在 S

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值