当前位置: 首页 > article >正文

使用RTP 协议 对 H264 封包和解包

学习内容:

本章探讨如何将h264的 avpacket的视频 数据,通过RTP协议发送到 流媒体 服务器 或者 对端接受者。

前提

我们在将 YUV数据变成avframe后,通过h264 编码变成AVPacket,例如,在安防项目中,或者直播中,需要将 avpacket发送到 流媒体服务器 或者 对端,那么如何做呢?

H264格式的回顾

音视频开发14 FFmpeg 视频 相关格式分析 -- H264 NALU格式分析-CSDN博客

这里将关键点 摘录出来:

帧内压缩: H264将图像分块为⽚、宏块和字块进⾏分⽚传输;通过这个过程实现对视频⽂件的压缩包装。

帧间压缩: H264采⽤了独特的I帧、P帧和B帧策略 来实现,连续帧之间的压缩;

H264编码结构- NALU

H.264 原始码流 ( 裸流 ) 是由⼀个接⼀个 NALU 组成。

就像下面这样:

AnnexB模式下的 NALU 的组成:[StartCode] [NALU Header] [NALU Payload] 

每个NALU = StartCode + 由一个1字节的NALU头部 + 一个包含控制信息编码视频数据的字节流组成

⼀个原始的 H.264 NALU 单元 

通常由 [StartCode] [NALU Header] [NALU Payload] 三部分组成。

Start Code 

Start Code ⽤于标示这是⼀个NALU 单元的开始,
必须是"00 00 00 01" 或"00 00 01",
H.264标准指出,当数据流是储存在介质上时,在每个NALU 前添加起始码:0x000001 或
0x00000001,⽤来指示⼀个NALU 的起始和终⽌位置:
在这样的机制下,在码流中检测起始码,作为⼀个NALU得起始标识,当检测到下⼀个起始码时,当前NALU结束。
3字节的0x000001只有⼀种场合下使⽤,就是⼀个完整的帧被编为多个slice(⽚)的时
候,包含这些slice的NALU 使⽤3字节起始码。其余场合都是4字节0x00000001的。

NALU Header

F为禁⽌位,占1bit  

forbidden_zero_bit: 在 H.264 规范中规定了这⼀位必须为 0。

R为重要性指示位,占2bit 

nal_ref_idc:取00~11,似乎指示这个NALU的重要性,如00的NALU解码器可以丢弃它⽽不影响图像的回放,0~3,取值越⼤,表示当前NAL越重要,需要优先受到保护。如果当前 NAL是属于参考帧的⽚,或是序列参数集,或是图像参数集这些重要的单位时,本句法元 素必需⼤于0。

T为负荷数据类型,占5bit

nal_unit_type:这个NALU单元的类型,1~12由H.264使⽤,24~31由H.264以外的应⽤

0      Unspecified                                                    non-VCL
        未指定
1      Coded slice of a non-IDR picture                               VCL
        ⼀个⾮IDR图像的编码条带slice_layer_without_partitioning_rbsp()
2      Coded slice data partition A                                   VCL
        编码条带数据分割块A slice_data_partition_a_layer_rbsp()
3      Coded slice data partition B                                   VCL
        编码条带数据分割块B slice_data_partition_b_layer_rbsp( )
4      Coded slice data partition C                                   VCL
        编码条带数据分割块C slice_data_partition_c_layer_rbsp( )
5      Coded slice of an IDR picture                                  VCL
        IDR图像的编码条带(⽚) slice_layer_without_partitioning_rbsp( )
6      Supplemental enhancement information (SEI)                     non-VCL
        辅助增强信息 (SEI)sei_rbsp( )
7      Sequence parameter set                                         non-VCL
        序列参数集 seq_parameter_set_rbsp( )
8      Picture parameter set                                          non-VCL
        图像参数集 pic_parameter_set_rbsp( )
9      Access unit delimiter                                          non-VCL
        访问单元分隔符 access_unit_delimiter_rbsp( )
10     End of sequence                                                non-VCL
        序列结尾 end_of_seq_rbsp( )
11     End of stream                                                  non-VCL
        流结尾end_of_stream_rbsp( )
12     Filler data                                                    non-VCL
        填充数据filler_data_rbsp( )
13     Sequence parameter set extension                               non-VCL
        序列参数集扩展seq_parameter_set_extension_rbsp( )
14     Prefix NAL unit                                                non-VCL
        NAL 单元前缀
15     Subset sequence parameter set                                  non-VCL
        子集序列参数集
16     Depth parameter set                                            non-VCL
        深度参数集
17..18 Reserved                                                       non-VCL
        保留
19     Coded slice of an auxiliary coded picture without partitioning non-VCL
        未分割的辅助编码图像的编码条带slice_layer_without_partitioning_rbsp( )
20     Coded slice extension                                          non-VCL
        编码切片扩展
21     Coded slice extension for depth view components                non-VCL
        深度视图组件的编码切片扩展
22..23 Reserved                                                       non-VCL
        保留
24..31 Unspecified                                                    non-VCL
        未定义

将H264 原始码流 ( 裸流 ) 从packet 分解出来 代码示例


http://www.kler.cn/a/446141.html

相关文章:

  • 周末总结(2024/12/21)
  • 机动车油耗计算API集成指南
  • 知网研学 | 知网文献(CAJ+PDF)批量下载
  • Spring Boot--06--整合Swagger
  • React:闭包陷阱产生和解决
  • 【ETCD】【Linearizable Read OR Serializable Read】ETCD 数据读取:强一致性 vs 高性能,选择最适合的读取模式
  • 浏览器可以直接请求 websocket
  • 基于springboot+vue实现的医院急诊(病房)管理系统 (源码+L文+ppt)4-122
  • 变量的作用域和生命周期
  • docker pull失败处理
  • 人脸生成3d模型 Era3D
  • 【漏洞复现】CVE-2023-37461 Arbitrary File Writing
  • Web3.0安全开发实践:探索比特币DeFi生态中的PSBT
  • 网络安全-企业环境渗透2-wordpress任意文件读FFmpeg任意文件读
  • GESP CCF C++八级编程等级考试认证真题 2024年12月
  • Unity DOTS中的share component
  • 大数据机器学习算法和计算机视觉应用07:机器学习
  • 深入了解 MyBatis:简化 Java 数据库交互
  • K8s 节点 NotReady 后 Pod的变化
  • fpga系列 HDL:Quartus II 时序约束 静态时序分析 (STA) PLL生成时钟约束
  • WPF依赖属性详解
  • [项目代码] YOLOv8 遥感航拍飞机和船舶识别 [目标检测]
  • 信息安全管理与评估赛题第7套
  • WPF 依赖属性和附加属性
  • ElasticSearch 自动补全
  • GObject 简明教程(一)