音视频概要

ops/2024/10/18 22:30:42/

YUV原理的讲解

YUV是一种常见的视频像素格式,经常用在视频编解码上面,YUV分别由Y分量和U、V分量(红色投影Cr)组成。Y分量指的是亮度分量,也就是我们经常说的灰阶值,相当于一副灰色的图像。而U分量和V分量表示的是色度分量,它的作用就是用于影像的色彩以及饱和度,常用于指定像素的颜色,U分量是图像蓝色部分去掉亮度Y,V分量是图像红色部分去掉亮度Y。换言之如果一副图像只有Y分量,没有UV分量就相当于我们看黑白电视一样,没有颜色,所以现在大部分彩色电视都引用了YUV像素格式。

YUV采样格式

YUV444

相当于Y、U、V三个分量采用相同的采样比例进行采样。所以用YUV444采样生成的图像,YUV三个分量的信息是完整的,都是8bit,也就是一个字节。这里的YUV444顾名思义就是4个Y分量、4个U分量、4个V分量。Y分量大小:w * h;U分量大小:w * h;V分量大小:w * h。所以,我们用YUV444格式去采样一个1920 * 1080的图像的时候,得到的大小等于:(1920 * 1080 * 8 + 1920 * 1080 * 8 + 1920 * 1080 * 8)/8/1024/1024 ~= 5.94M。从计算公式可以看出,YUV444每一帧图像大小和RGB差不多,所以在真正开发中很少会用到。

YUV422

相当于U、V分量是以Y分量采样的一半进行采样,Y分量和UV分量按照2:1的比例进行采样(也可以理解为两个Y分量对应一个UV分量)。就比方说,若一个水平方向有8个像素点,那么采样了8个Y分量,那么UV分量只有4个。这里采样用的是4个Y分量、2个U分量、2个V分量进行采样。Y分量大小:w * h;U分量:w * h /2;V分量:w * h /2。所以,用YUV422采样的大小是:(1920 * 1080 * 8 + (1920 * 1080)/2 * 8 + (1920 * 1080)/2 * 8)/8/1024/1024 ~= 3.96M。

YUV420

相当于每一行扫描的时候只扫描一种色度分量(U分量或者V分量),和Y分量按照2:1的方式进行采样(也可以理解为四个Y分量对应一个UV分量)。就比方说,在第一行扫描的时候,YV分量按照2:1的方式进行采样,那么YU分量也是用2:1的方式采样,所以对于每个色度分量来说,它的水平方向和垂直方向的采样比都是2:1。这里采用的是4个Y分量、2个U分量、0个V分量采集,而下一行的则是用4个Y分量、0个U分量、2个V分量采样。所以,Y分量大小:w * h;U分量:w * h /4;  V分量:w * h/4。所以用YUV420采集一个1920 * 1080的图像大小:(1920 * 1080 * 8 + (1920 * 1080)/4 * 8 + (1920 * 1080)/4 * 8)/8/1024/1024 ~=2.97M 。可以看到用YUV420采样的图像比YUV444和YUV422都节省空间,因此它是目前最主流的采样格式。

YUV存储格式

Planar指的是平面格式

它的特点是先连续存储所有的Y像素点,然后再存储所有的U像素点,最后存储所有的V像素点。换言之它分三个数组存储三个分量,比方说data[0]存储所有的Y分量、data[1]存储所有的U分量、data[2]存储所有的V分量。

Packed指的是打包格式

它的特点是所有像素点的YUV分量都是连续存储,并且所有的数据都存储在data[0]里面。

YUV打包格式

YUV4202采样格式

NV12

这种方式使用的是平面格式来存储数据,换言之就是先存储Y分量、 然后UV交替存储。

Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7 U0 V0...

NV21

这种方式使用的是平面格式来存储数据,换言之就是先存储Y分量、 然后VU交替存储。

Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7 V0 U0...

YV12

这种方式使用的是平面格式来存储数据,换言之就是先存储Y分量、 然后存V分量、 最后存U分量,Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7 V0 U0...

YU12

这种方式使用的是平面格式来存储数据,换言之就是先存储Y分量、 然后存U分量、 最后存V分量,Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7 U0 V0...

YUV422采样格式

YUYV

采用的是打包方式存储,它的特点是每个像素点采用Y分量存储,但是每隔一个像素点用UV分量采样Y0 U0 Y1 V0 Y2 U2 Y3 V2

UYVY

采用的是打包方式存储,它的特点是每个像素点采用U分量再采样Y分量

U0 Y0 V0 Y1 U2 Y2 V2 Y3

YUV422P

采用的是平面方式存储,它的特点是先存储所有的Y分量、然后在存储U分量、最后存储V分量Y0

Y0 Y1 Y2 Y3 U0 U1 V0 V1

VI模块

vi模块重要参数

VI捕捉视频的类型,这里面有两种。一种是DMA模式(VI_CHN_BUF_TYPE_DMA)、另外一种是MMAP模式(VI_CHN_BUF_TYPE_MMAP):

**DMA指的是直接访问内存的方式,相当于音视频数据直接从硬件传输到内存里面。这种方式的优点就是两边传输的速度非常之快,但缺点就是非常消耗硬件资源,对硬件外设资源要求较高。

MMAP

RV1126的VI模块初始化API

 

注意,这里管道和通道的关系有可能是一对一或者是一对多

多线程获取VI模块的YUV数据

 代码演示

宏定义

结构体的初始化

设置VI模块并使能

启动VI模块

使用多线程的方式去采集

中止

while循环中一直使用的是!false,当变成true之后就会直接退出循环,也就是当用户按Ctrl+c之后,就会中止程序


http://www.ppmy.cn/ops/93679.html

相关文章

C# VisionPro 海康相机SDK源代码

运行界面如下所时: 实时图像效果如下: Winform窗体代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Fo…

【开端】Java 分页工具类运用

一、绪论 Java系统中,分页查询的场景随处可见,本节介com.baomidou.mybatisplus.core.metadata.IPage;来分页的工具类 二、分页工具类 public class PageUtils implements Serializable { private static final long serialVersionUID 1L; /**…

一篇文章教会你如何使用Haproxy,内含大量实战案例

1. Haproxy 介绍 HAProxy是法国开发者 威利塔罗(Willy Tarreau) 使用C语言编写的自由及开放源代码软件,是一款具备高并发(万级以上)、高性能的TCP和HTTP应用程序代理. HAProxy运行在当前的硬件上,可以支持…

论企业私域流量运营中的玩法创新与开源 AI 智能名片 O2O 商城小程序的应用

摘要:本文旨在探讨企业在构建私域流量池时的多种玩法策略,并着重分析如何针对不同类型客户制定个性化方案。同时,引入开源 AI 智能名片 O2O 商城小程序这一工具,阐述其在私域流量运营中的重要作用和价值,为企业提升运营…

【JAVA开发】JAVA开发手册

前言 《Java开发手册》是阿里巴巴集团技术团队的集体智慧结晶和经验总结,经历了多次大规模一线实战的检验及不断的完善,系统化地整理成册,反馈给广大开发者。现代软件行业的高速发展对开发者的综合素质要求越来越高,因为不仅是编…

allegor工具实现位号自动对齐

前言:用allegor绘制PCB时,需要调丝印,于是想到能用工具或者skill实现位号自动对齐。 主要用到两个功能:Lable tune,和Change Lable tune* 对齐之前是这样的 然后做如下设置 选择Allegor productivity Toolbox, 然…

探索list与iterator的区别及yield的用法

1 问题 探索list与iterator的区别探索yield的用法 2 方法 通过网上学习后了解到 List返回的类型是list,list只会查询一级缓存。list()中返回的List中每个对象都是原本的对象。查询的时候没遍历一个对象会产生一条sql;而iterator这个迭代器返回的类型是it…

Sketch软件挑战Adobe Illustrator:国产设计软件的竞争力分析

你是否知道如何选择合适的界面设计软件?你是否知道设计美观的用户界面软件有哪些吗?,以及你是否知道良好用户体验的应用程序,需要哪些界面设计软件?根据不同的产品界面功能,所选的界面设计软件也会有所不同…