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

使用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                                  VCLIDR图像的编码条带(⽚) 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-VCLNAL 单元前缀
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.mrgr.cn/news/80982.html

相关文章:

  • FFmpeg 安装教程(Windows 系统)
  • [x86 ubuntu22.04]投影模式选择“只使用外部”,外部edp屏幕无背光
  • Swin transformer 论文阅读记录 代码分析
  • 练13:二分法
  • 【机器学习】—时序数据分析:机器学习与深度学习在预测、金融、气象等领域的应用
  • springboot443旅游管理系统(论文+源码)_kaic
  • 使用“NodeMCU”、“红外模块”实现空调控制
  • Day12 梯度下降法的含义与公式
  • php各个版本的特性以及绕过方式
  • 基础电路的学习
  • 在VBA中结合正则表达式和查找功能给文档添加交叉连接
  • 分析excel硕士序列数据提示词——包含对特征的筛选
  • k8s迁移——岁月云实战笔记
  • JWT令牌与微服务
  • Pytorch | 利用MI-FGSM针对CIFAR10上的ResNet分类器进行对抗攻击
  • GTID详解
  • (耗时4天制作)详细介绍macOS系统 本博文含有全英版 (全文翻译稿)
  • 本地计算机上的MySQL服务启动后停止(connection refused: connect)解决一系列数据库连接不上的问题
  • 在UE5中调用ImGui图形界面库
  • [创业之路-202]:任正非管理华为的思想与毛泽东管理党、军队、国家的思想的相似性与差异性
  • Linux——卷
  • 【day09】面向对象编程进阶
  • 汽车IVI中控开发入门及进阶(43):NanoVG
  • Leetcode-208. 实现Trie(前缀树)
  • SQL进阶技巧:如何计算算法题分发糖果问题?
  • Java开发经验——数据库开发经验