GB28181技术基础之2 - H264与PS封包

本文介绍了H264编码的基础知识,包括I帧、P帧和B帧的概念以及GOP的定义。同时,详细阐述了GB28181标准中的PS封包格式,涉及ES、PES和PS的层级结构,以及PTS和DTS在音视频同步中的作用。

一. H.264

       视频传输离不开编码,编码过程可以理解为数据压缩过程,由于原始的视频数据太过于庞大,直接传输对带宽的占用太大,因此通过一种压缩方式来进行处理,最常用的是我们常说的H.264标准,也是安防监控领域实际的行业标准。

        

       H.264 是属于 FPEG-4 的一种标准编解码格式,要理解 编解码原理 首先要理解 I帧 | P帧 | B帧 的概念:

> I帧

    I 帧(Independent)是指 关键帧,保留了完整的图片信息,不需要参考其他帧。

    解码时 只需要当前帧数据就可以完成解码,数据量比较大。

> I帧

    P 帧(Prev) 是指 前向预测编码帧,只记录变化部分像素信息(增量信息)。

    解码时 需要参考前面的 I帧或P帧 来完成解码,因此如果出现前面 P帧部分丢失,会影响解码质量。

    由于只记录了 部分增量信息,因此数据量很小。

> B帧

    B 帧 是指 双向编码帧,既需要参考前面的 I/P 帧,也可以参考后面的 I/P 帧,相对比较复杂。

### 使用GB28181标准通过RTP协议推送H.264编码的PS封装音频 #### RTP协议概述 RTP(实时传输协议)用于互联网上针对多媒体数据流的一种传输协议。RTP旨在解决多播或单播网络服务中的实时数据传送问题,特别适用于视频会议、电话呼叫其他实时应用。为了确保音视频数据能够高效可靠地在网络上传输,RTP提供了时间戳记、序列号等功能来帮助接收端处理接收到的数据包。 #### H.264 PS 封装格式说明 对于基于GB28181标准的应用场景而言,所使用的H.264码流是以PS(Program Stream)形式进行打包后再经由RTP协议发送出去[^3]。这种封装方式可以更好地适应广播级媒体分发需求,并且保持了较高的兼容性稳定性。 #### 音频部分的具体实现方法 当涉及到具体实施时,在遵循上述原则的基础上还需注意以下几点: - **RTP负载构建**: 对于每帧压缩后的AAC/MP3等格式的声音样本,应按照ITU-T H.225.0 Annex E规定的方法将其分割成适当大小并加入到RTP payload当中去。 - **同步控制机制**: 由于音画不同步会影响用户体验,所以在实际操作过程中要严格把控PTS (Presentation Time Stamp),DTS (Decoding Time Stamp) 的准确性,使得播放器可以在解码之后依据这些标记完成精准的时间轴对齐工作。 - **头部信息设置**: 根据RFC3550的要求填写必要的字段如版本号(V=2), padding标志(P=0), 扩展标志(X=0), CSRC计数(CC=0); 同样也要参照RFC3640为MPEG-4 Audio/AAC LC配置特定参数比如采样率(Sampling Rate) 声道数目(Channels)[^1]. ```python import socket from struct import pack, unpack def create_rtp_header(payload_type, sequence_number, timestamp, ssrc): version = 2 << 6 padding = 0 extension = 0 csrc_count = 0 marker_bit = 0 header = bytearray() # Version, P, X, CC, M and Payload Type byte_1 = version | padding << 5 | extension << 4 | csrc_count byte_2 = marker_bit << 7 | payload_type & 0x7F header.extend(pack('!BB', byte_1, byte_2)) # Sequence Number header.extend(pack('!H', sequence_number)) # Timestamp header.extend(pack('!I', timestamp)) # SSRC identifier header.extend(pack('!I', ssrc)) return header # Example usage of the function to send an audio frame over RTP using UDP sockets. sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) audio_frame_data = b'\xAA\xBB' * 1024 # Replace with actual encoded audio data. rtp_payload_type_for_aac = 96 # This is just an example value; check your system's configuration. sequence_num = 1 timestamp = int(time.time()) % (2**32) ssrc_identifier = hash("unique_source_id") % (2**32) header = create_rtp_header(rtp_payload_type_for_aac, sequence_num, timestamp, ssrc_identifier) packet = header + audio_frame_data destination_ip = "192.168.1.1" port = 5004 sock.sendto(packet, (destination_ip, port)) ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值