使用RTP 协议 对 H264 封包和解包,h264的avpacket和NAL的关系
学习内容:
本章探讨如何将h264的 avpacket的视频 数据,通过RTP协议发送到 流媒体 服务器 或者 对端接受者。
前提
我们在将 YUV数据变成avframe后,通过h264 编码变成AVPacket,例如,在安防项目中,或者直播中,需要将 avpacket发送到 流媒体服务器 或者 对端,那么如何做呢?
H264格式的回顾
音视频开发14 FFmpeg 视频 相关格式分析 -- H264 NALU格式分析-CSDN博客
这里将关键点 摘录出来:
帧内压缩: H264将图像分块为⽚、宏块和字块进⾏分⽚传输;通过这个过程实现对视频⽂件的压缩包装。
帧间压缩: H264采⽤了独特的I帧、P帧和B帧策略 来实现,连续帧之间的压缩;
H264编码结构- NALU
H.264 原始码流 ( 裸流 ) 是由⼀个接⼀个 NALU 组成。
就像下面这样:
NALU Header
F为禁⽌位,占1bit
forbidden_zero_bit: 在 H.264 规范中规定了这⼀位必须为 0。
R为重要性指示位,占2个bit
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对于内部连接一个一个的NALU有两种模式
AnnexB模式: ffmpeg解析出来的模式
AVCC模式: 存储在本地的mp4文件的模式
因此 存在AnnexB模式 和 AVCC模式转换的问题
解决方案:如下博客搜索 “AnnexB和 AVCC的转换"
音视频开发14 FFmpeg 视频 相关格式分析 -- H264 NALU格式分析-CSDN博客
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的。
AVCC 模式下的一个一个NALU的链接方式
也叫mp4 模式,⼀般 mp4 mkv 都是 mp4 模式,没有 startcode , SPS 和 PPS 以及其它信息
被封装在extradata 也叫做 container中,每⼀个 frame 前⾯ 4 个字节是这个 frame 的⻓度
回顾:将avpacket 存储为h264代码
音视频开发21 FFmpeg 视频解复用练习,将一个mp4文件,分解成一个aac文件 和 h264文件_ffmpeg解复用mp4例程-CSDN博客
核心内容如下:
当我们从mp4中读取到 video stream 的avpacket 后,如果存储到h264文件,存储的内容为 avpacket的data,存储的大小为avpacket 的size,如下的核心代码。h264_fd 为要存储到的out.h264文件的句柄。
-
fwrite(avpacket->data, 1, avpacket->size, h264_fd);
avpacket 和 NAL关系
例如对于H.264来说。1个AVPacket的data通常对应一个NAL。【注意:此处强调是“通常”,不是“所有”】
注意:在这里只是对应,而不是一模一样。他们之间有区别,区别的部分可以参考雷神的博客,核心内容是:
通过查看FFMPEG源代码我们发现,AVPacket中data的数据起始处没有分隔符(0x00000001), 也不是0x65、0x67、0x68、0x41等字节,所以可以AVPacket肯定这不是标准的nalu。其实,AVPacket前4个字表示的是nalu的长度,从第5个字节开始才是nalu的数据。所以直接将AVPacket前4个字节替换为0x00000001即可得到标准的nalu数据。
关于雷神的这个博客,猜测有可能是分析的a.mp4文件读取后的avpacket,这和AVCC模式很像,前面4个字节都是大小,那么问题是,如果是从 ffmpeg 中通过读取到数据是AnnexB 模式的,带有startcode,又如何呢?
使用FFMPEG类库分离出多媒体文件中的H.264码流_ffmpeg 抽码流-CSDN博客
使用RTP 将H264 原始码流 ( 裸流 ) 从packet 分解出来 代码示例
相关文章:
使用RTP 协议 对 H264 封包和解包,h264的avpacket和NAL的关系
学习内容: 本章探讨如何将h264的 avpacket的视频 数据,通过RTP协议发送到 流媒体 服务器 或者 对端接受者。 前提 我们在将 YUV数据变成avframe后,通过h264 编码变成AVPacket,例如,在安防项目中,或者直播…...
面试经典问题 —— 最大/小前K个数问题(top - K)问题
目录 常见思路更优的解法(面试官喜欢的) 常见思路 要选出最小的前K个数首先我们会想到排排升序建大堆,排降序建小堆 一个直观的想法是使用(小根堆),起始将所有元素放入堆中,然后再从堆中取出k 个…...
HNUST-数据分析技术课堂实验
1.要求 1,从下列第一、二、三组实验中各至少选取一个算法进行实验,选修组实验不作强制要求;2,实验过程不限,目标在于锻炼算法实现过程,即可采用C、C、Java、Python(建议)等任意语言编…...
HEIC 是什么图片格式?如何把 iPhone 中的 HEIC 转为 JPG?
在 iPhone 拍摄照片时,默认的图片格式为 HEIC。虽然 HEIC 格式具有高压缩比、高画质等优点,但在某些设备或软件上可能存在兼容性问题。因此,将 HEIC 格式转换为更为通用的 JPG 格式就显得很有必要。本教程将介绍如何使用简鹿格式工厂…...
Next.js 14 性能优化:从首屏加载到运行时优化的最佳实践
在现代 Web 应用中,性能优化直接影响用户体验和业务转化。Next.js 14 提供了多种内置的性能优化特性,今天我们就来深入探讨如何充分利用这些特性,以及一些实用的优化技巧。 图片和字体优化 1. 图片优化 Next.js 的 Image 组件供了强大的图…...
T-SQL语言的软件开发工具
T-SQL:微软SQL Server的强大工具 引言 在现代软件开发中,数据的管理与操作是不可或缺的一部分,而T-SQL(Transact-SQL)作为微软SQL Server的重要组成部分,承担着数据查询、数据操作、数据插入和数据删除等…...
Ubuntu环境 nginx.conf详解(二)
1、nginx.conf 结构详解: http 块:用于配置 HTTP 服务器的相关设置,包括处理 HTTP 和 HTTPS。 stream 块:用于配置 TCP/UDP 代理服务器,适用于需要进行四层负载均衡的情况。 ... # 全局块 events {...} …...
【Linux】centos7安装php7.4
环境说明 本文档在服务器不能连接互联网的情况下,进行安装php7.4及其扩展。 操作系统:centos7.6 架构:X86_64 一、安装依赖(可选) 说明:服务器能联网就可以通过 yum install 命令下载对应php需要的依赖。…...
OpenHarmony-6.IPC/RPC组件
IPC/RPC组件机制 1.基本概念 IPC:设备内的进程间通信(Inter-Process Communication)。 RPC:设备间的进程间通信(Remote Procedure Call)。 IPC/RPC用于实现跨进程通信,不同的是前者使用Binder驱…...
自然语言处理与知识图谱的融合与应用
目录 前言1. 知识图谱与自然语言处理的关系1.1 知识图谱的定义与特点1.2 自然语言处理的核心任务1.3 二者的互补性 2. NLP在知识图谱构建中的应用2.1 信息抽取2.1.1 实体识别2.1.2 关系抽取2.1.3 属性抽取 2.2 知识融合2.3 知识推理 3. NLP与知识图谱融合的实际应用3.1 智能问答…...
Pytorch | 利用VA-I-FGSM针对CIFAR10上的ResNet分类器进行对抗攻击
Pytorch | 利用VA-I-FGSM针对CIFAR10上的ResNet分类器进行对抗攻击 CIFAR数据集VA-I-FGSM介绍相关定义算法流程 VAI-FGSM代码实现VAI-FGSM算法实现攻击效果 代码汇总vaifgsm.pytrain.pyadvtest.py 之前已经针对CIFAR10训练了多种分类器: Pytorch | 从零构建AlexNet对…...
【Java基础面试题028】Java中的hashCode和equals方法,与==操作符有什么区别?
回答重点 hashcode、equals 和 都是Java中用于比较对象的三种方式,但是它们的用途和实现还是有挺大区别的。 hashcode用于散列存储结构中确定对象的存储位置。可用于快速比较两个对象是否不同,因为如果它们的哈希码不同,那么它们肯定不相等…...
[ThinkPHP]5.0.23-Rce 1
[ThinkPHP]5.0.23-Rce 1 根据题目知道这是一个5.0.23的PHP RCE,话不多说直接上扫描器 检测出Payload url地址: ?scaptcha&test-1 Post表单参数: _method__construct&filter[]phpinfo&methodget&server[REQUEST_METHOD]1HackBar构造p…...
ByConity BSP 解锁数据仓库新未来
文章目录 前言BSP 模式简介基于 TPC-DS 的 ELT 活动测试环境登录 ECS数据查询配置 执行 02.sqlsql解释:1. 第一步:创建 wscs 临时表2. 第二步:创建 wswscs 临时表3. 第三步:对比 2001 年和 2002 年的数据子查询 1:提取…...
应对 Google Play 政策违规:开发者账号被终止解除指南
目录 解封指南 申诉文案 谷歌问题 授权书 1、授权书标题及双方信息 2、游戏信息 3、授权内容 4、双方义务与责任 5、费用与支付 5、保密条款 6、争议解决 8、其他条款 9、签字盖章 10、日期 相关推荐 解封指南 由于开发人员的疏忽,移除了读写权限的动态申请,使…...
【ES6复习笔记】Map(14)
概念 Map 是 JavaScript 中的一种数据结构,它允许你存储键值对,并且可以通过键来访问对应的值。在本教程中,我们将学习如何声明、添加、删除、获取和遍历 Map 集合。 ES6 提供了 Map 数据结构。它类似于对象,也是键值对的集合。…...
重温设计模式--8、命令模式
文章目录 命令模式的详细介绍C 代码示例C代码示例2 命令模式的详细介绍 定义与概念 命令模式属于行为型设计模式,它旨在将一个请求封装成一个对象,从而让你可以用不同的请求对客户端进行参数化,将请求的发送者和接收者解耦,并且能…...
人工智能ACA(七)——计算机视觉基础
一、自然语言处理基本介绍 1. 自然语言处理的定义 1-1 自然语言 人类使用的在社会生活中自然形成的语言 1-2 自然语言处理 目标是让计算机能够理解、解析、生成和处理人类的自然语言 包含自然语言理解和自然语言生成两部分组成 2. 自然语言处理的发展趋势 3.自然语言处理…...
RCE常见姿势
文章目录 常见漏洞执行函数:1.系统命令执行函数2.代码执行函数 命令拼接符读取文件命令绕过:空格过滤绕过关键字绕过长度过滤绕过无参数命令执行绕过无字母数字绕过利用%0A截断利用回溯绕过利用create_function()代码注入无回显RCE1.反弹shell2.dnslog外…...
CSS系列(36)-- Containment详解
前端技术探索系列:CSS Containment详解 ⚡ 致读者:探索性能优化的艺术 👋 前端开发者们, 今天我们将深入探讨 CSS Containment,这个强大的性能优化特性。 基础概念 🚀 包含类型 /* 布局包含 */ .layo…...
golang,多个proxy拉包的处理逻辑
在Go语言中,当你设置了多个代理(GOPROXY)时,Go工具链会按照你设置的顺序尝试每个代理。如果第一个代理失败,它会尝试下一个代理,直到成功获取到模块或者所有代理都尝试失败。最后,如果所有代理都…...
Vue使用Tinymce 编辑器
目录 一、下载并重新组织tinymce结构二、使用三、遇到的坑 一、下载并重新组织tinymce结构 下载 npm install tinymce^7 or yarn add tinymce^7重构目录 在node_moudles里找到tinymce文件夹,把里面文件拷贝一份放到public下,如下: -- pub…...
神经网络-AlexNet
AlexNet是在2012年的ImageNet竞赛后,整理发表的文章,也是对CNN网络的衍生。 网络结构 AlexNet网络结构如下图所示,网络分为了上下两部分,对应两个不同的GPU训练,可以更好的利用GPU算力。只有在特殊的网络层后&#x…...
《人工智能:洞察材料微观与宏观性能关系的神奇之眼》
在材料科学的广袤天地里,一个前沿且充满魅力的课题正吸引着全球科研人员的目光——如何借助人工智能的强大力量,精准模拟材料微观结构与宏观性能之间那错综复杂的关系。这不仅是解开材料性能之谜的关键钥匙,更是推动从航空航天到电子芯片等众…...
count(1)、count(_)与count(列名)的区别?
大家好,我是锋哥。今天分享关于【count(1)、count(_)与count(列名)的区别?】面试题。希望对大家有帮助; count(1)、count(_)与count(列名)的区别? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 SQL 中,…...
Docker 镜像加速访问方案
在数字化时代,Docker以其轻量级和便捷性成为开发者和运维人员的首选容器技术。然而自2023年5月中旬起,Docker Hub 的访问速度较慢或不稳定,这对依赖Docker Hub拉取镜像的用户来说无疑是一个挑战。本文将提供 Docker Hub 访问的一系列替代方案…...
菜鸟带新鸟——基于EPlan2022的部件库制作(3D)
设备逻辑的概念: 可在布局空间 中和其它对象上放置对象。可将其它对象放置在 3D 对象上。已放置的对象分到组件的逻辑结构中。 将此属性的整体标识为设备逻辑。可使用不同的功能创建和编辑设备逻辑。 设备的逻辑定义 定义 / 旋转 / 移动 / 翻转:组…...
笔记工具--MD-Markdown的语法技巧
MD格式,全称为Markdown格式,是一种轻量级标记语言文件,主要用于创建格式化文本。以下是对MD格式的详细解释: 一、定义与特点 定义:MD文件是一种纯文本格式的文件,使用简单的符号或语法来标记标题、列表、…...
【ES6复习笔记】生成器(11)
什么是生成器函数 生成器函数是一种特殊的函数,它可以在执行过程中暂停并保存当前状态,然后在需要时恢复执行。生成器函数通过 yield 关键字来实现暂停和恢复执行的功能。 生成器函数的基本用法 定义生成器函数:使用 function* 关键字来定…...
【解决报错】AttributeError: ‘NoneType‘ object has no attribute ‘group‘
学习爬虫时,遇到如下报错: 报错原因: 正则表达式的 search 或 finditer 方法没有找到任何匹配项,可能是换行符处理不当等。 解决方法如下: 在正则表达式末尾加上re.S即可,re.S是一个编译标志,…...
UE5.3 C++ Ceiusm中的POI 制作3DUI 结合坐标转化
一.核心思路WidgetComponent CesiumGloberAnchor 二.先制作POI 创建C Actor来制作,APOI。直接上代码 #pragma once#include "CoreMinimal.h" #include "GameFramework/Actor.h" #include "CesiumGlobeAnchorComponent.h" #includ…...
机器学习系列(一)——K-近邻算法
1. 算法定义 KNN 算法属于基于实例的机器学习方法。在对未知数据进行分类或回归之前,我们不需要对数据进行显式的训练或建立复杂的模型。它的核心思想是:对一个新的样本点,寻找在特征空间上与其最相似的 K 个已知数据点,采取“投…...
Android unitTest 单元测试用例编写(初始)
文章目录 了解测试相关库导入依赖库新建测试文件示例执行查看结果网页结果其他 本片讲解的重点是unitTest,而不是androidTest哦 了解测试相关库 androidx.compose.ui:ui-test-junit4: 用于Compose UI的JUnit 4测试库。 它提供了测试Compose UI组件的工具和API。 and…...
uni-app 跨端开发精美开源UI框架推荐
🎀🎀🎀uni-app 跨端开发系列 🎀🎀🎀 一、uni-app 组成和跨端原理 二、uni-app 各端差异注意事项 三、uni-app 离线本地存储方案 四、uni-app UI库、框架、组件选型指南 五、uni-app 蓝牙开发 六、uni-app …...
【微服务】微服务之Feign 与 Ribbon
文章目录 强烈推荐引言优点Feign示例什么是Ribbon?Ribbon 的优点Netflix Feign 和 Ribbon整合Feign 与 Ribbon 的关系Feign 与 Ribbon 结合使用的示例配置文件(application.yml)说明: Feign 与 Ribbon 结合使用的应用场景1. 动态服…...
【C语言】成绩等级制
将成绩分为A、B、C、D、E等级。具体的等级划分如下: A:90分及以上B:80分到89分C:70分到79分D:60分到69分E:60分以下 #include <stdio.h> int main() {float score 0;printf("请输入学生成绩&a…...
Flutter 插件开发入门
1、初识 Flutter Plugin Flutter 的插件类似于我们在 Android 中说的第三方库,通过使用插件,可以借助插件中的代码实现一些额外功能。 Flutter 的插件以 package 的形式存在,使用 package 的目的是为了达到模块化,可以让代码被共…...
2024.12.25在腾讯云服务器上使用docker部署flask
2024.12.25在腾讯云服务器上使用docker部署flask 操作系统:Ubuntu 根据腾讯云的说明文档安装 Docker 并配置镜像加速源,注意需要安装腾讯云的加速源,使用官网的加速源连接极其不稳定,容易导致运行失败。使用哪个公司的云服务器就…...
2024 年12月英语六级CET6听力原文(Lecture部分)
2024 年12月英语六级CET6听力原文(Long Conersation和Passage) 1 牛津大学关于普遍道德准则的研究及相关观点与建议 译文 2 食物颜色对味觉体验及大脑预期的影响 译文 3 财务资源对意义与幸福之间关系的影响研究 译文...
centos 释放系统预留内存并关闭Kdump服务
背景:Kdump是Linux系统的一种内核崩溃转储机制,它允许在系统发生内核崩溃(例如内核panic)时,捕获内存的转储信息,从而帮助事后分析故障原因。该过程需要一块预留内存(称为crashkernel内存&#…...
基于WEB的房屋出租管理系统设计
摘 要 随着城市化程度的推进,越来越多的人涌入城市,同时也带来的旺盛的租房需求,传统的房屋出租管理依赖人 工记录的方式难以满足人们对房屋出租管理的需求。因此,本文根据房屋出租信息化的需求设计一款基于房屋出租 的管理系统。…...
云边端架构的优势是什么?面临哪些挑战?
一、云边端架构的优势 降低网络延迟:在传统集中式架构中,数据需传输到云计算中心处理,导致网络延迟较高。而云边端架构将计算和存储推向边缘设备,可在离用户更近的地方处理数据,大大降低了网络延迟,提升了用…...
clickhouse解决suspiciously many的异常
1. 问题背景 clickhouse安装在虚拟机上,持续写入日志时,突然关机,然后重启,会出现clickhouse可以正常启动,但是查询sql语句,提示suspiciously many异常,如图所示 2. 问题修复 touch /data/cl…...
爬虫 APP 逆向 ---> shopee(虾皮) 电商
shopee 泰国站点:https://shopee.co.th/ shopee 网页访问时,直接弹出使用 app 登录查看,那就登录 shopee 泰国站点 app。 手机抓包:分类接口 接口:https://mall.shopee.co.th/api/v4/pages/get_category_tree 请求参…...
用例图和活动图的区别与联系
在软件开发过程中,需求分析是至关重要的一步。为了更好地理解和描述系统的功能需求,开发人员通常会使用各种图形化工具。其中,用例图和活动图是两种非常常用的工具。虽然它们都用于描述系统的行为,但各自具有不同的特点和适用场景…...
接口请求中调试可以看到Origin,其具体的作用
接口请求中带 Origin 是浏览器在跨域请求时自动添加的一个 HTTP 请求头,用于标识请求的来源(源)。Origin 头的主要作用是支持跨域资源共享(CORS)和增强安全性。 Origin 的含义 Origin 包含发起请求的源信息࿰…...
知识图谱+大模型:打造全新智慧城市底层架构
在数字化时代,智慧城市的建设正迎来新一轮的变革。本文将探讨如何结合知识图谱和大模型技术,构建智慧城市的全新底层架构,以应对日益增长的数据量和复杂性,提升城市管理的智能化水平。 知识图谱:智慧城市的知识库 知识…...
Android基于Path的addRoundRect,Canvas剪切clipPath简洁的圆形图实现,Kotlin(2)
Android基于Path的addRoundRect,Canvas剪切clipPath简洁的圆形图实现,Kotlin(2) import android.content.Context import android.graphics.BitmapFactory import android.graphics.Canvas import android.graphics.Path import a…...
计算机图形学知识点汇总
一、计算机图形学定义与内容 1.图形 图形分为“图”和“形”两部分。 其中,“形”指形体或形状,存在于客观世界和虚拟世界,它的本质是“表示”;而图则是包含几何信息与属性信息的点、线等基本图元构成的画面,用于表达…...
【EtherCATBasics】- KRTS C++示例精讲(2)
EtherCATBasics示例讲解 目录 EtherCATBasics示例讲解结构说明代码讲解 项目打开请查看【BaseFunction精讲】。 结构说明 EtherCATBasics:应用层程序,主要用于人机交互、数据显示、内核层数据交互等; EtherCATBasics.h : 数据定义…...