音视频入门知识(二)、图像篇
⭐二、图像篇
视频基本要素:宽、高、帧率、编码方式、码率、分辨率
其中码率的计算:码率(kbps)=文件大小(KB)*8/时间(秒),即码率和视频文件大小成正比
YUV和RGB可相互转换
★YUV(原始数据)
YUV是音视频(编解码)最常用的格式。
YUV 是一种色彩空间的编码格式,用于表述图像或视频帧中的颜色信息。它将颜色分为三个分量:
- Y(亮度,明暗信息)
- U 和 V(色度,分别代表蓝色和红色的偏离度信息,用于编码色彩)
YUV420/422可通过ffmpeg/opencv直接编码成H264编码
-
YUV444、YUV422、YUV420
代表 YUV 色彩格式中不同的采样模式,描述了亮度(Y)和色度(U、V)分量在空间中的采样比例。后面的数字代表y、u、v在一个像素中各自占的比例。
444:代表每个像素都有完整的 Y、U 和 V 数据。也就是说,色度和亮度分辨率是相同的。
422:亮度(Y)仍然是逐像素采样的,但色度(U 和 V)分量是每两个像素水平采样一次,即色度分辨率在水平方向上为亮度的一半。
420:亮度(Y)分量仍然是逐像素采样的,但色度(U 和 V)分量每两个像素水平采样一次,并在垂直方向上每两行采样一次,因此色度的水平和垂直分辨率都是亮度的一半

YUV的数据格式保存有两种分类方式(视频压缩方式),即**“空间-间”和“空间-内”。“空间-间”的划分方式主要体现在Y、U、V的比例不同**;“空间-内”的划分方式主要体现在Y、U、V的比例一定,存储格式不同。
空间-间编码(时空编码)
空间-间编码(也称时空编码)是指对帧之间的相关性进行压缩。视频是一系列连续的图像帧,其中相邻帧之间通常会有很高的相似度,因此通过只记录帧间的差异可以显著降低数据量,例如帧间预测(P 帧、B 帧)利用前后帧的相关性减少数据存储。此种编码方式常用于视频压缩标准(如H.264、H.265)中的**“帧间预测”**部分。
帧类型
-
I帧:帧内编码帧,只参考当前帧内容进行压缩。解码时不需要其他帧,因此是独立的,适合作为关键帧。
-
P帧:预测帧,通过参考前面一个 I 帧或 P 帧进行编码,仅记录与参考帧的差异信息
-
B帧:双向预测帧,通过参考前后的 I 帧或 P 帧来编码,提高了压缩效率。
空间-内编码(帧内编码)
空间内编码(也称帧内编码)是指在单帧图像内部进行压缩,不参考其他帧。利用图像内部的相似性(如色块、纹理等)来去除冗余信息,只在单个帧内进行压缩。
一般用于视频压缩中的关键帧(I帧)压缩,以确保独立解码
以下是三种不同的YUV图像存储方式。
-
Packet打包
即先存储一个yuv,再存储下一个yuv;
示例:YUV444 的打包格式可能是
YUV YUV YUV的顺序;而 YUV422 则是YYUV YYUV。优点:读取方便,因为每个像素的颜色分量是连续的。
缺点:存储效率较低,适合在特定的硬件或视频处理中使用。
-
Planar平面(用P简写代表)
先存储y平面,再存储u平面,再存储v平面,即 Y、U、V 分量分开存储,每个分量各占一块“平面”区域。
优点:适合对每个分量单独进行处理,常用于视频压缩和解码中的计算。
缺点:因为色度平面的数据较少,处理可能会较复杂,但节省空间。
-
Semi-Planner半平面(用NV简写代表)
先存储y平面,再存储uv平面;即Y 平面独立存储,而 U 和 V 分量共享一个平面
优点:节省存储空间,读取较为方便,因此广泛用于现代视频编解码中。
缺点:虽然节省了空间,但比完全的平面格式稍难以单独处理 U 和 V。
示例:(12代表一个像素点占的bit位数)

★H.264(编码格式)
广泛应用的视频压缩标准。
数据格式
NAL 层(Network Abstraction Layer) + VCL 层(Video Coding Layer)
◆ VCL:H264编码/压缩的核心,主要负责将视频数据编码/压缩,再切分。
◆ NALU = NALU header + NALU payload
-
NAL层
NAL 层是 H.264 编码数据的封装层,用于将编码后的视频数据封装成独立的单元,以便传输和存储。
每一个 NAL 单元(NAL Unit)包含一个NAL 头和负载数据
NAL单元的起始码(Start Code) 常见为
0x000001或0x00000001-
NAL 头(1B):用于描述当前 NAL 单元的类型(如I帧、P帧等)
◆ F(forbidden_zero_bit):1 位,初始为0。当网络识别此单元存在比特错误时,可将其设为 1,以便接收方丢掉该单元。
◆ NRI(nal_ref_idc):2 位,用来指示该NALU 的重要性等级。
◆ Type(nal_unit_type):5 位,指出NALU 的类型

常见的NAL单元类型
-
IDR 帧(NAL Type 5):关键帧,独立解码的 I 帧,用于随机访问。
-
非 IDR 帧(NAL Type 1):用于 P 帧或 B 帧等非关键帧。
-
序列参数集(SPS,NAL Type 7):包含视频序列的全局参数,如分辨率、帧率等。
-
图像参数集(PPS,NAL Type 8):包含单个或多个图片的参数,如预测模式、量化参数等。
-
负载数据:存储实际的视频编码数据,如帧内预测、帧间预测的数据等。
-
-
VCL层
负责实际的视频数据编码,它将视频图像压缩成基本的编码单元(如宏块、块等),并使用 H.264 的压缩算法生成相应的数据
◆ 压缩:预测(帧内预测和帧间预测)-> DCT变化和量化 -> 比特流编码;
◆ 切分数据,主要为了第三步。“切片(slice)”、“宏块(macroblock)"是在VCL中的概念,一方面提高编码效率和降低误码率、另一方面提高网络传输的灵活性。
◆ 包装成『NAL』。
- Slice(片):每一帧可以由一个或多个 Slice 组成,便于错误恢复。Slice 是一组连续的宏块,每个 Slice 可以独立解码。
- 宏块(Macroblock):H.264 中基本的编码单元,每个宏块包含 16x16 的像素区域,并根据帧内或帧间模式进行编码。
- 块(Block):宏块可以细分为 8x8 或 4x4 的块,用于 DCT 变换和预测。
-
H.264文件封装格式
H.264 编码的数据可以封装在不同的文件格式中,以便在各种应用场景中使用
- 裸流(.264 或 .h264):直接存储 H.264 编码后的 NAL 单元数据,常用于调试和测试。
- MP4 / MOV:一种常见的容器格式,用于存储音视频流,包含更多的元数据(如时间戳、索引等),便于流式播放和快进。
- MPEG-TS(.ts):传输流格式,常用于广播和网络传输,有较好的错误恢复能力。
- MKV:一种开源的多媒体封装格式,支持多种编码格式和多音轨,广泛用于高质量视频存储。
参考文献:https://www.cnblogs.com/say-Hai/articles/18630636
相关文章:
音视频入门知识(二)、图像篇
⭐二、图像篇 视频基本要素:宽、高、帧率、编码方式、码率、分辨率 其中码率的计算:码率(kbps)=文件大小(KB)*8/时间(秒),即码率和视频文件大小成正比 YUV和RGB可相互转换 ★YUV(原始数据&am…...
v-if 和 v-show 的区别
一、原理区别 1. v-if 这是一个指令,用于条件性地渲染一个元素块。当v-if表达式的值为true时,元素及其包含的子元素才会被渲染到 DOM 中;当表达式的值为false时,元素及其子元素会被完全移除。这意味着在切换v-if的条件时&#x…...
解密MQTT协议:从QOS到消息传递的全方位解析
1、QoS介绍 1.1、QoS简介 使用MQTT协议的设备大部分都是运行在网络受限的环境下,而只依靠底层的TCP传输协议,并不 能完全保证消息的可靠到达。 MQTT提供了QoS机制,其核心是设计了多种消息交互机制来提供不同的服务质量,来满足…...
Java-02 深入浅出 MyBatis - MyBatis 快速入门(无 Spring) POM Mapper 核心文件 增删改查
点一下关注吧!!!非常感谢!!持续更新!!! 大数据篇正在更新!https://blog.csdn.net/w776341482/category_12713819.html 目前已经更新到了: MyBatisÿ…...
Unity功能模块一对话系统(4)实现个性文本标签
本期我们将了解如何在TMPro中自定义我们的标签样式,并实现两种有趣的效果。 一.需求描述 1.定义<float>格式的标签,实现标签处延迟打印功能 2.定义<r" "></r>格式的标签,实现标签区间内文本片段的注释显示功能…...
git在idea中操作频繁出现让输入token或用户密码,可以使用凭证助手(使用git命令时输入的用户密码即可) use credential helper
1、打开 idea 设置,找到 git 路径 File | Settings | Version Control | Git 2、勾选 Use credential helper 即可...
毫米波雷达技术:(九)快时间窗和慢时间窗的概念
(一)快时间窗: 快时间窗通常指的是在雷达脉冲周期内,对每个脉冲回波进行采样的时间段。这个时间段非常短,通常在 0 − 100 n s 0-100ns 0−100ns 。在快时间窗内,雷达系统会对接收到的回波信号进行高分辨…...
宠物行业的出路:在爱与陪伴中寻找增长新机遇
在当下的消费市场中,如果说有什么领域能够逆势而上,宠物行业无疑是一个亮点。当人们越来越注重生活品质和精神寄托时,宠物成为了许多人的重要伴侣。它们不仅仅是家庭的一员,更是情感的寄托和生活的调剂。然而,随着行业…...
Android MQTT关于断开连接disconnect报错原因
最近项目遇到一个需求,就是在登录状态的时候。才能接收到消息。所有我在上线,下线状态的时候。做了MQTT断开和连接的动作。然后就是发生了。我们标题的这关键点了。直接报错了。报错的内容如下: MqttAndroidClient unregisterRecevicer afte…...
Unity3D中Huatuo可行性的思维实验详解
引言 Unity3D作为一款功能强大的跨平台游戏引擎,在游戏开发领域具有举足轻重的地位。它不仅支持2D和3D游戏开发,还广泛应用于虚拟现实、建筑可视化等领域。其中,Huatuo作为一个强大的热更新解决方案,通过扩展Unity的IL2CPP运行时…...
ES-聚合分析
ES的聚合分析 什么是ES的聚合分析 ElasticSearch除搜索意外,提供的针对ES数据进行统计分析的功能通过聚合,我们会得到一个数据的概览,是分析和总结全套的数据,而不是寻找单独的文档高性能,只要一条语句就可以得到分析…...
【CSS in Depth 2 精译_093】16.2:CSS 变换在动效中的应用(上)—— 图标的放大和过渡效果的设置
当前内容所在位置(可进入专栏查看其他译好的章节内容) 第五部分 添加动效 ✔️【第 16 章 变换】 ✔️ 16.1 旋转、平移、缩放与倾斜 16.1.1 变换原点的更改16.1.2 多重变换的设置16.1.3 单个变换属性的设置 16.2 变换在动效中的应用 ✔️ 16.2.1 放大图…...
Linux Debian安装ClamAV和命令行扫描病毒方法,以及用Linux Shell编写了一个批量扫描病毒的脚本
ClamAV是一个开源的跨平台病毒扫描引擎,用于检测恶意软件、病毒、木马等安全威胁。 一、Linux Debian安装ClamAV 在Linux Debian系统上安装ClamAV,你可以按照以下步骤进行: 更新软件包列表: 打开终端并更新你的软件包列表&#…...
Spring创建异步线程,使用@Async注解时不指定value可以吗?
在Spring中使用Async注解时,不指定value是可以的。如果没有指定value(即线程池的名称),Spring会默认使用名称为taskExecutor的线程池。如果没有定义taskExecutor线程池,则Spring会自动创建一个默认的线程池。 默认行为…...
二分和离散化
为什么把二分和离散化放一起:因为离散化其实是一种二分整数的过程。 二分 相信大家都接触过二分查找(折半查找),这就是二分的思想。 二分通过每次舍弃一半并不存在答案的区间,进而快速锁定要求的答案(二…...
深度学习实战102-基于深度学习的网络入侵检测系统,利用各种AI模型和pytorch框架实现网络入侵检测
大家好,我是微学AI,今天给大家介绍一下深度学习实战102-基于深度学习的网络入侵检测系统,利用各种AI模型和pytorch框架实现网络入侵检测。近年来,网络安全威胁日益严峻,传统基于规则的方法难以应对复杂多变的入侵手段。 深度学习技术凭借其强大的特征学习能力和自适应性,…...
vue3使用element-plus,解决 el-table 多选框,选中后翻页再回来选中失效问题
问题:勾选的数据分页再回来回消失 1.在el-table中加 :row-key"getRowKey" const getRowKey (row) > { return row.id; // id必须是唯一的 }; 2.给type为selection的el-table-column添加上reserve-selection属性 <el-tableref"multipleTab…...
网络的类型
BMA---广播型多路访问--在一个网段内可以放置多个物理节点,同时该范围内可以实施广播洪泛机制 【1】以太网-->共享型 属性典型的 BMA类型;以太网技术的核心为频分一在同一物理介质上,使用多个相互不干涉的频率电波来共同传输数据,实现带宽的不断提升…...
实现类似gpt 打字效果
1. css的动画(animation) css中实现动画有两种方式:transition过渡动画、 animation自定义动画。 具体的可以看MDN链接:https://developer.mozilla.org/zh-CN/docs/Web/CSS/animation 使用keyframes自定义关键帧动画并未其命名使用自定义动…...
项目需求分析流程
项目需求分析是软件开发或任何工程项目中至关重要的第一步。它帮助确保团队理解客户的需求,并为后续的设计、开发和测试工作提供指导。以下是一个详细的需求分析流程: 一、确定项目目标 与利益相关者沟通:包括但不限于客户、最终用户、销售…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...
微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
MFE(微前端) Module Federation:Webpack.config.js文件中每个属性的含义解释
以Module Federation 插件详为例,Webpack.config.js它可能的配置和含义如下: 前言 Module Federation 的Webpack.config.js核心配置包括: name filename(定义应用标识) remotes(引用远程模块࿰…...
ubuntu系统文件误删(/lib/x86_64-linux-gnu/libc.so.6)修复方案 [成功解决]
报错信息:libc.so.6: cannot open shared object file: No such file or directory: #ls, ln, sudo...命令都不能用 error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory重启后报错信息&…...
Pydantic + Function Calling的结合
1、Pydantic Pydantic 是一个 Python 库,用于数据验证和设置管理,通过 Python 类型注解强制执行数据类型。它广泛用于 API 开发(如 FastAPI)、配置管理和数据解析,核心功能包括: 数据验证:通过…...
【HarmonyOS 5】鸿蒙中Stage模型与FA模型详解
一、前言 在HarmonyOS 5的应用开发模型中,featureAbility是旧版FA模型(Feature Ability)的用法,Stage模型已采用全新的应用架构,推荐使用组件化的上下文获取方式,而非依赖featureAbility。 FA大概是API7之…...
flow_controllers
关键点: 流控制器类型: 同步(Sync):发布操作会阻塞,直到数据被确认发送。异步(Async):发布操作非阻塞,数据发送由后台线程处理。纯同步(PureSync…...
