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

⭐二、图像篇

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

​ 其中码率的计算:码率(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.mzph.cn/bicheng/65329.shtml

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

相关文章

信息安全管理:开发测试安全管理checklist

开发测试安全管理包括安全需求、安全设计、安全编码测试、系统部署上线、商用及开源软件使用、开发测试资源安全六个部分的内容。 01.安全需求 在信息系统需求阶段是否考虑安全需求?信息系统安全需求是否经过论证?信息系统安全需求过程是否有业务部门参…

CTFshow—爆破

Web21 直接访问页面的话会弹窗需要输入密码验证,抓个包看看,发现是Authorization认证,Authorization请求头用于验证是否有从服务器访问所需数据的权限。 把Authorization后面的数据进行base64解码,就是我们刚刚输入的账号密码。 …

lin.security提权靶场渗透

声明! 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关&a…

【魅力golang】之-泛型

早期的golang版本是不支持泛型的,这对于从其它语言转型做go开发的程序员来说,非常不友好,自 1.18开始golang正式支持泛型,解决了开发者在编写通用代码时的需求。泛型通过类型参数允许函数和数据结构支持多种类型,从而提…

输入输出流 - cin, cout 的使用

引言 在编程中,输入和输出是与用户交互的重要方式。C 提供了标准输入输出流 cin 和 cout 来处理这些操作。本文将详细介绍如何使用 cin 和 cout 进行基本的输入和输出操作,并通过实例帮助读者更好地理解和掌握这些概念。 一、标准输出流 cout cout 是 …

数据结构(Java)——链表

1.概念及结构 链表是一种 物理存储结构上非连续 存储结构,数据元素的 逻辑顺序 是通过链表中的 引用链接 次序实现的 。 2.分类 链表的结构非常多样,以下情况组合起来就有 8 种链表结构: (1)单向或者双向 (…

pdf有密码,如何实现pdf转换word?

PDF想要转换成其他格式,但是当我们将文件拖到PDF转换器进行转换的时候发现PDF文件带有密码怎么办?今天分享PDF有密码如何转换成word方法。 方法一、 PDF文件有两种密码,打开密码和限制编辑,如果是因为打开密码,建议使…

C++ 面向对象编程:继承中构造与析构函数顺序、继承中的同名属性访问、继承中的同名函数访问

在继承中&#xff0c;构造链中&#xff0c;先构造的后析构 见以下代码示例&#xff1a; #include<iostream> using namespace std;class animal1 { public:animal1() {cout << "animal1 构造" << endl;}~animal1() {cout << "animal1…

Springboot项目下面使用Vue3 + ElementPlus搭建侧边栏首页

Springboot项目下面、在html 页面 Vue3 ElementPlus 搭建侧边栏首页 1、效果图 2、static 文件下面的项目结构 3、代码实现 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>首页</title><…

Segment Routing Overview

大家觉得有意义和帮助记得及时关注和点赞!!! Segment Routing (SR) 是近年来网络领域的一项新技术&#xff0c;“segment” 在这里 指代网络隔离技术&#xff0c;例如 MPLS。如果快速回顾网络设计在过去几十年的 发展&#xff0c;我们会发现 SR 也许是正在形成的第三代网络设计…

【Rust自学】7.3. use关键字 Pt.1:use的使用与as关键字

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 7.3.1. use的作用 use的作用是将路径导入到当前作用域内。而引入的内容仍然是遵守私有性原则&#xff0c;也就是只有公共的部分引入进来才…

如何在Express.js中定义多个HTTP方法?

在 Express.js 中定义多个 HTTP 方法的路由&#xff0c;你可以选择几种不同的方式来实现。以下是两种主要的方法&#xff1a; 1. 使用 app.route() app.route() 提供了一种链式定义多个HTTP方法的能力&#xff0c;这有助于避免重复书写相同的路径。这种方式特别适合当同一个路…

讲一个自己写的 excel 转 html 的 java 工具

由来 这是一个从开发需求中诞生的工具&#xff0c;在工作中因为有一个 excel 转 html 的任务&#xff0c;又没找到一个专门做这方面的工具&#xff08;其他工具几乎都是简单的转换&#xff0c;无法还原 excel 样式&#xff0c;而且转换的宽高有点儿差距&#xff09;&#xff0…

Cursor提示词

你是一位经验丰富的项目经理&#xff0c;对于用户每一次提出的问题&#xff0c;都不急于编写代码&#xff0c;更多是通过深思熱虑、结构化的推理以产生高质量的回答&#xff0c;探索更多的可能方案&#xff0c;并从中寻找最佳方案。 约束 代码必须可以通过编译回答尽量使用中…

USB 状态机及状态转换

文章目录 USB 状态机及状态转换连接状态供电状态默认状态地址状态配置状态挂起状态USB 状态机及状态转换 枚举完成之前,USB 设备要经过一系列的状态变化,才能最终完成枚举。这些状态是 连接状态 - attached供电状态 - powered默认状态 - default地址状态 - address配置状态 -…

如何在短时间内读懂复杂的英文文献?

当我们拿起一篇文献开始阅读时&#xff0c;就像是打开了一扇通往未知世界的大门。但别急着一头扎进去&#xff0c;咱们得像个侦探一样&#xff0c;带着疑问去探险。毕竟&#xff0c;知识的海洋深不可测&#xff0c;不带点“装备”怎么行&#xff1f;今天就聊聊&#xff0c;平时…

VS Code AI开发之Copilot配置和使用详解

随着AI开发工具的迅速发展&#xff0c;GitHub Copilot在Cursor、Winsuf、V0等一众工具的冲击下&#xff0c;推出了免费版本。接下来&#xff0c;我将为大家介绍GitHub Copilot的配置和使用方法。GitHub Copilot基于OpenAI Codex模型&#xff0c;旨在为软件开发者提供智能化的代…

Android --- 在AIDL进程间通信中,为什么使用RemoteCallbackList 代替 ArrayList?

1.RemoteCallbackList vs ArrayList RemoteCallbackList 是一个特殊的 List&#xff0c;它用来管理跨进程的回调&#xff0c;特别是当回调对象是在不同进程中时。它在 AIDL&#xff08;Android Interface Definition Language&#xff09;通信中常常用来处理跨进程的通信。 Arr…

Prometheus 专栏 —— Prometheus入门介绍

Prometheus 是? Prometheus 是一个开源的服务监控系统和时序数据库&#xff0c;主要用于收集、存储、查询和告警时间序列数据&#xff0c;这些数据通常反映了系统或者应用的状态或性能 Prometheus 的基本功能是? 数据采集数据存储数据查询告警通知 Prometheus 监控核心组件?…

FIR数字滤波器设计——窗函数设计法——滤波器的时域截断

与IIR数字滤波器的设计类似&#xff0c;设计FIR数字滤波器也需要事先给出理想滤波器频率响应 H ideal ( e j ω ) H_{\text{ideal}}(e^{j\omega}) Hideal​(ejω)&#xff0c;用实际的频率响应 H ( e j ω ) H(e^{j\omega}) H(ejω)去逼近 H ideal ( e j ω ) H_{\text{ideal}}…