音视频入门知识(二)、图像篇

news2024/12/27 7:55:54

⭐二、图像篇

视频基本要素:宽、高、帧率、编码方式、码率、分辨率

​ 其中码率的计算:码率(kbps)=文件大小(KB)*8/时间(秒),即码率和视频文件大小成正比

YUV和RGB可相互转换

★YUV(原始数据)

YUV是音视频(编解码)最常用的格式。

YUV 是一种色彩空间的编码格式,用于表述图像或视频帧中的颜色信息。它将颜色分为三个分量:

  • Y(亮度,明暗信息)
  • UV(色度,分别代表蓝色和红色的偏离度信息,用于编码色彩)

YUV420/422可通过ffmpeg/opencv直接编码成H264编码

  • YUV444YUV422YUV420

    代表 YUV 色彩格式中不同的采样模式,描述了亮度(Y)和色度(U、V)分量在空间中的采样比例。后面的数字代表y、u、v在一个像素中各自占的比例。

    ​ 444:代表每个像素都有完整的 Y、U 和 V 数据。也就是说,色度和亮度分辨率是相同的

    ​ 422:亮度(Y)仍然是逐像素采样的,但色度(U 和 V)分量是每两个像素水平采样一次,即色度分辨率在水平方向上为亮度的一半。

    ​ 420:亮度(Y)分量仍然是逐像素采样的,但色度(U 和 V)分量每两个像素水平采样一次,并在垂直方向上每两行采样一次,因此色度的水平和垂直分辨率都是亮度的一半

    640 (2)

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位数)

640 (3)

★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) 常见为 0x0000010x00000001

    • 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2266264.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

论文研读:AnimateDiff—通过微调SD,用图片生成动画

1.概述 AnimateDiff 设计了3个模块来微调通用的文生图Stable Diffusion预训练模型, 以较低的消耗实现图片到动画生成。 论文名:AnimateDiff: Animate Your Personalized Text-to-Image Diffusion Models without Specific Tuning 三大模块: 视频域适应…

百度地图绘制行政区域及设置中心点

// 画行政区 const drwaDistrict (disList, clear true) > {clear && clearOverlays();if (!bMapGL.value) return;let bd new bMapGL.value.Boundary();disList.map((item) > {bd.get(item, function (rs1) {// rs1 是行政区对应的点集合 此处非每次必反信息…

jetson Orin nx + yolov8 TensorRT 加速量化 环境配置

参考【Jetson】Jetson Orin NX纯系统配置环境-CSDN博客 一 系统环境配置: 1.更换源: sudo vi /etc/apt/sources.list.d/nvidia-l4t-apt-source.list2.更新源: sudo apt upgradesudo apt updatesudo apt dist-upgrade sudo apt-get updat…

VirtualBox下ubuntu23.04使用主机串口以及使用 minicom 进行串口调试

VirtualBox下ubuntu23.04使用主机串口以及使用 minicom 进行串口调试 一、打开设备管理器看主机(Window系统)是否识别出串口,我这边显示的串行通信端口是COM3 二、打开VirtualBox,设置串口和USB设备 串口设置: 启用…

Python 自动化 打开网站 填表登陆 例子

图样 简价: 简要说明这个程序的功能: 1. **基本功能**: - 自动打开网站 - 自动填写登录信息(号、公司名称、密码) - 显示半透明状态窗口实时提示操作进度 2. **操作流程**: - 打开网站后自动…

本原多项式

将 G F ( p ) GF(p) GF(p)延伸为有 p m p^m pm个元素的域,称之为 G F ( p ) GF(p) GF(p)的扩域,表示为 G F ( p m ) GF(p^m) GF(pm). G F ( p ) GF(p) GF(p)是 G F ( p m ) GF(p^m) GF(pm)的子集。 G F ( p m ) GF(p^m) GF(pm)元素个数为 p m p^m pm。 …

【物联网技术与应用】实验15:电位器传感器实验

实验15 电位器传感器实验 【实验介绍】 电位器可以帮助控制Arduino板上的LED闪烁的时间间隔。 【实验组件】 ● Arduino Uno主板* 1 ● 电位器模块* 1 ● USB电缆*1 ● 面包板* 1 ● 9V方型电池* 1 ● 跳线若干 【实验原理】 模拟电位器是模拟电子元件,模…

能省一点是一点 - 享元模式(Flyweight Pattern)

享元模式(Flyweight Pattern) 享元模式(Flyweight Pattern)享元模式(Flyweight Pattern)概述享元模式包含的角色:享元模式应用场景 talk is cheap, show you my code总结 享元模式&a…

学习C++:变量

变量: 作用:给一段指定的内存空间起名,方便操作这段内容 (变量存在的意义:方便我们管理内存空间) 语法:数据类型 变量名 初始值; 实例:

蓝桥杯物联网开发板硬件组成

第一节 开发板简介 物联网设计与开发竞赛实训平台由蓝桥杯大赛技术支持单位北京四梯科技有限公司设计和生产,该产品可用于参加蓝桥杯物联网设计与开发赛道的竞赛实训或院校相关课程的 实践教学环节。 开发板基于STM32WLE5无线微控制器设计,芯片提供了25…

Day35汉明距离

两个整数之间的 汉明距离 指的是这两个数字对应二进制位不同的位置的数目。 给你两个整数 x 和 y,计算并返回它们之间的汉明距离。 class Solution {public int hammingDistance(int x, int y) {int cnt 0;while (Math.max(x, y) ! 0) {if ((x & 1) ! (y &…

matplotlib pyton 如何画柱状图,利用kimi,直接把图拉倒上面,让他生成

要绘制类似于您提供的图像的柱状图,您可以使用Python中的Matplotlib库,这是一个非常流行的绘图库。以下是一个简单的示例代码,展示如何使用Matplotlib来创建一个类似的柱状图: python import matplotlib.pyplot as plt import nu…

计算机网络——期末复习(3)4-6章考试重点

第四章 根据IPv4第1个十进制数值判断,127以下为A类,128~191为B类,192~223为C类不能分配给主机或路由器接口的:A类网络号0和127,主机号全为0或全为1私有地址(Private IP Address)是指一类专门保…

【安全编码】Web平台如何设计防止重放攻击

我们先来做一道关于防重放的题,答案在文末 防止重放攻击最有效的方法是( )。 A.对用户密码进行加密存储使用 B.使用一次一密的加密方式 C.强制用户经常修改用户密码 D.强制用户设置复杂度高的密码 如果这道题目自己拿不准,或者…

【WebAR-图像跟踪】在Unity中基于Imagine WebAR实现AR图像识别

写在前面的话 感慨一下, WebXR的发展是真的快,20年的时候,大多都在用AR.js做WebAR。随着WebXR标准发展,现在诸如Threejs、AFrame、Unity等多个平台都支持里WebXR。 本文将介绍在Unity中使用 Image Tracker实现Web端的AR图像识别功…

HTML5实现好看的圣诞节网站源码

HTML5实现好看的圣诞节网站源码 前言一、设计来源1.1 主界面1.2 圣诞节由来界面1.3 圣诞活动界面1.4 圣诞活动门票界面1.5 团队介绍界面1.6 圣诞照片墙界面1.7 圣诞留言界面1.8 圣诞趣事界面1.9 联系我们界面 二、效果和源码2.1 动态效果2.2 源代码 源码下载结束语 HTML5实现好…

go下载依赖提示连接失败

1、现象 Go下载模块提示连接失败 dial tcp 142.251.42.241:443: connectex: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.…

分布式事务入门 一

分布式事务入门 一 您好,我是今夜写代码,今天学习下分布式事务相关理论,以及常见的解决方案,为后续掌握Seata分布式事务框奠定基础。 为什么需要分布式事务? 分布式事务主要由于存储资源的分布性,通常涉及多个数据库。 分布式…

VSCode设置Playwright教程

1.安装扩展 打开VS Code,在扩展—>搜索"Playwright Test for VSCode",点击安装 按快捷键CommandShiftP,输入install playwright,点击安装Playwright 安装成功会有如下提示 2.调试脚本 打开tests/example.spec.ts文…

在一个C工程文件中,如果一个函数要引用另一个文件中的函数,并不是用extern进行声明,而是在包含的头文件中进行声明

在C语言的某个工程中,一个不是主函数的函数如果引用另一个文件中的某个函数,是不是要先用extern引入?比如下面的代码: void DisplayInit(void) {extern void FramebufferInit(void);FramebufferInit(); }在C语言中,不…