精华内容
下载资源
问答
  • YUV

    千次阅读 2018-05-05 00:16:29
    YUVYUV是通常用作彩色图像流水线的一部分的颜色编码系统。它使用人类感知而不是“直接”RGB表示法以人类图像的形式对彩色图像或图像进行编码。 Y'UV标准将符合Y'UV标准。术语Y'UV,YUV,YCbCr,YPbPr等的范围有时...

    YUV:

    YUV是通常用作彩色图像流水线的一部分的颜色编码系统。它使用人类感知而不是“直接”RGB表示法以人类图像的形式对彩色图像或图像进行编码。 Y'UV标准将符合Y'UV标准。

    术语Y'UV,YUV,YCbCr,YPbPr等的范围有时是不明确和重叠的。历史上,术语YUV和Y'UV用于电视系统中的颜色信息的特定模拟编码,而YCbCr用于适合于视频和静止图像压缩以及作为MPEG和JPEG传输的颜色信息的数字编码。今天,术语YUV通常用于计算机行业来描述使用YCbCr编码的文件格式。

    Y'UV模型根据亮度(Y')和两个色度(UV)分量定义颜色空间。 Y'UV彩色模型用于PAL复合彩色视频(不包括PAL-N)标准。以前的黑白系统仅使用亮度(Y')信息。彩色信息(U和V),通过副载波单独添加,以便黑白接收机仍能够以接收机本机黑白格式接收和显示彩色图像。

    Y'代表亮度分量(亮度),U和V代表色度(色彩)分量;亮度用Y表示,亮度用Y'表示 - 主符号(')表示伽马压缩,[1]其中“亮度”表示物理线性空间亮度,而“亮度”是(非线性)感知亮度。

    模拟视频组件中使用的YPbPr色彩模型及其数字视频中使用的数字版本YCbCr或多或少地来源于它,有时称为Y'UV。 (CB / PB和CR / PR在蓝色 - 黄色和红 - 青色轴上偏离灰色,而U和V分别是蓝色 - 亮度和红色 - 亮度等级)。模拟NTSC电视中使用的Y'IQ色彩空间广播系统与其相关,尽管以更复杂的方式。 YDbDr色彩空间用于模拟SECAM和PAL-N电视广播系统,因此它们是相关的。

    至于语源学,Y,Y',U和V不是缩写。字母Y用于亮度可以追溯到XYZ原色的选择。这自然适用于使用亮度相同的字母(Y'),这接近感知均匀的亮度相关性。同样,选择U和V来区分U和V轴与其他空间中的轴以及x和y色度空间。请参阅下面的公式或比较数学的历史发展。[2] [3] [4]

     

    历史

    当工程师想要黑白基础设施中的彩色电视时,发明了什么?[5]他们正在使用与黑白(B&W)电视兼容的信号传输方法。亮度分量已经作为黑白信号存在;他们添加了紫外线信号作为解决方案。

    因为U和V是色差信号,所以在R和B信号上选择色度的UV表示。换句话说,U和V信号告诉电视改变某个像素的颜色而不改变它的亮度。或者U和V信号告诉显示器以另一种为代价制造一种颜色。 U和V值越高(或负值越低),像素获得的饱和度越高(彩色)。 U和V值越接近零,红色,绿色和蓝色灯光越好。这是使用色差信号的好处,它不是告诉一个颜色有多少,而是多于绿色或蓝色。在这种情况下,当U和V信号为零或不存在时,它将只显示灰度图像。如果使用了R和B,即使在B&W场景中,它们也将具有非零值,需要全部三个数据携带信号。彩电早期的电视机,由于旧的黑白电视信号没有信号,这意味着彩电将只显示它作为B&W电视开箱即用。另外,黑白接收机可以接收Y信号并忽略U和V彩色信号,使Y'UV向后兼容所有现有的黑白设备,输入和输出。如果彩色电视标准没有使用色差信号,它会使B&W广播中出现色彩,或者需要额外的电路将B&W信号转换为彩色。有必要为色度信道分配较窄的带宽,因为没有额外的带宽可用。如果某些亮度信息通过色度信道到达,则B&W分辨率会受到影响。[6]
    转换为RGB
    SDTV与BT.601

    YUV信号通常由RGB(红色,绿色和蓝色)源创建。将R,G和B的加权值相加以产生Y',Y'是总体亮度或亮度的量度。 U和V被计算为Y与B和R值之间的缩放差异。

    BT.601定义了以下常量:

     

    YUV根据RGB计算如下:

     

    得到的Y',U和V的范围分别为[0,1],[-Umax,Umax]和[-Vmax,Vmax]。

    反转上述转换将Y'UV转换为RGB:

     

    等效地,将常量的值代入并将它们表示为矩阵给出了BT.601的这些公式:

     

    HDTV与BT.709
    HDTV Rec。709(非常接近SDTV Rec。601)与UHDTV Rec。2020相比

    用于HDTV的ATSC决定改变基本值WR和WB相比于SDTV系统先前选择的值。对于由建议提供HDTV合成值。709这一决定进一步影响对基体为Y'UV↔RGB因此,其成员值略有不同。其结果是,与SDTV和HDTV有反弹的基因两个不同的表示任何的RGB三元Y'UV可能:一个SDTV Y'UV和HDTV Y'UV之一。这意味着详细做当SDTV和HDTV之间直接转化,亮度(Y“)的信息是大致相同的,但色度的表示(U&V)信道的信息需要转换。仍然覆盖CIE 1931色彩空间,Rec.709色彩空间几乎与Rec.601相同,覆盖率为35.9%。[7]相比之下,2020年的UHDTV覆盖面积非常大,并且会进一步看到它自己的YUV / Y'UV矩阵集。

    BT.709定义了这些重量值:

     

    BT.709的转换矩阵和公式如下:

     

    笔记
     用于计算Y'(矩阵的顶行)的权重与Y'IQ颜色空间中使用的权重相同。
    对于U和V,产量为0.黑色,RGB =(0,0,0)产生YUV =(0,0,0)。 白色,RGB =(1,1,1),产生YUV =(1,0,0)。
    这些公式传统上用于模拟电视和设备; 数字设备搜索HDTV和数码摄像机使用Y'CbCr。

        

     

    [-1,1]范围内的UV平面

     

    数值近似值

    在开发近SIMD浮点处理器之前,大多数RGB→Y'UV的数字实现使用整数运算,特别是定点逼近。近似意味着所使用数字的精确度受到限制,因此精确地损失了时间量提高了计算速度。

    在下面的例子中,运算符“a”b {\ displaystyle a \ gg b} a \ gg b“右移b个二进制位置。为了澄清,变量使用两个后缀字符:“u”用于无符号最终表示,“t”用于缩小的中间值。以下示例仅适用于BT.601。 BT.709或任何其他可比标准。

    Y'值通常被移位并且被缩放到范围[16,235],而不是使用[0,255]的全部范围(被称为全摆幅或“PC水平“)。这种做法在SMPTE-125M中被标准化,以适应由于滤波引起的信号过冲(“振铃”)。值235容纳最大的255-235 = 20,或20 /(235-16)= 9.1%黑色到白色过冲的,所有这是的约8.9%比理论最大过冲(吉布斯现象)略大最大的一步。脚趾空间较小,仅允许16/219 = 7.3%的超调,这比理论最大超调量8.9%小。这就是为什么16被添加到Y'以及为什么基本变换中的Y'系数总和为220而不是255. [8] U和V的值,其可以是正的或负,都与128相加,以使它们总是正的,给人一种范围16至240工作室U和V(这些范围中的视频编辑和制作重要的,因为使用了错误的黑人和白人,或低对比度的图像。)

    BT.601

    为了获得SDTV / BT.601的Y'UV的传统“演播室摆动”8比特表示,可以使用以下操作:

    1.从8位RGB到16位值的基本转换(Y':无符号,U / V:带符号,矩阵值四舍五入到所需的Y'范围[16..235]和U / V 达到[16..240]的范围):

     

    2.用四舍五入(“+128”)(Y':无符号,U / V:带符号)缩小(“>> 8”)为8位:

     

    3.为这些值添加一个偏移量以消除任何负值(所有结果均为8位无符号):

     

    BT.601全面展开

    为了获得SDTV / BT.601的Y'UV的“全速”8比特表示,可以使用以下操作:

    1.从8位RGB到16位值的基本转换(Y':无符号,U / V:有符号,矩阵值四舍五入到每个[0..255]的Y'UV范围 而不会发生溢出):

     

    2.使用舍入(“+128”)(Y':无符号,U / V:带符号)缩小(“>> 8”)为8位值:

     

    3.为这些值添加一个偏移量以消除任何负值(所有结果均为8位无符号):

     

    一般的亮度/色度系统

    亮度/色度系统搜索Y'UV的主要优势,以及它相对的Y'IQ和YDbDr,是因为它们与黑白模拟电视(主要归功于Georges Valensi的工作)兼容。 Y'通道保存黑白相机记录的所有数据,因此它产生适合在旧的单色显示器上接收的信号。在这种情况下,U和V被简单地丢弃。如果显示颜色,则可以解码原始RGB信息。

    YUV的另一个优点是可以放弃一些信息以减少带宽。人眼对颜色的空间敏感度相当小:亮度通道的准确度比其他两个更明显。了解这种人为的缺点,NTSC和PAL标准大大降低了色度通道的带宽。 (带宽处于时间域,但随着图像被扫描出来,这转换为空间域。)

    因此,所得到的信号可能被“压缩”。在NTSC(Y'IQ)和PAL制式中,色度信号的带宽明显小于亮度。 NTSC的早期版本正在迅速变得越来越流行。只保留与亮度信息相比较的水平分辨率(术语4:2:2色度子采样),并且通常垂直分辨率减半(给出4:2:0)。 4:1:1(当垂直分辨率为全分辨率时,水平分辨率分为四等分)与亮度分辨率相比,色彩分辨率高四分之一。今天,只有高端设备处理使用4:4:4的色度子采样,亮度和颜色信息的分辨率相同。

    I和Qusks是根据人类视觉而选择的,其中一种是最小的,另一种是偶然的(90度)。然而,真正的I和Q解调更复杂,需要两条模拟延迟线,而NTSC接收机很少使用它。

    然而,这是本发明的类比,其中使用了模拟设备(包括传送数字信号的RCA连接器)是YUV,YIQ,甚至是CVBS)。此外,NTSC和PAL是以使带宽高的色度和亮度信号相互混合的方式呈现的,以保持与黑白电视设备的向后兼容性,这导致点爬行和交叉色彩伪影。当NTSC标准在20世纪50年代创建时,情况并非如此。然而,今天的现代电视能够显示比这些有损信号中包含的信息更多的信息。为了跟上新显示技术的能力,从20世纪70年代后期开始尝试在传输图像时保留更多的Y'UV信号,例如SCART(1977)和S-Video(1987)连接器。

    代替Y'UV,Y'CbCr被用作(数字)通用视频压缩算法(如MPEG-2)的标准格式。数字电视和DVD以MPEG-2格式保存压缩视频流,MPEG-2格式使用完整的Y'CbCr色彩空间,保留已建立的色度二次采样过程。专业CCIR 601数字视频格式还采用Y'CbCr,色度采样率为4:2:2,主要用于兼容以前的模拟视频标准。这个流可以很容易地混合到任何需要的输出格式中。

    YUV不是绝对的色彩空间。 RGB着色剂用于显示信号。因此,如果使用标准的RGB着色剂(即固定的一组主色度,或者特定的红色,绿色和蓝色的组),则表示为Y'UV的值是可预测的。

    此外,RGB(无论是BT.601还是Rec.709)的颜色和亮度(称为色域)范围小于YUV允许的颜色和亮度范围。由于上述公式可能会产生“无效的”RGB值 - 即低于0%或远远超过该范围的100%的值(例如,从Y'UV(或Y'CbCr)转换为RGB),这可能非常重要。在电视和高清内容的标准16-235亮度范围(和16-240色度范围)之外,或在PC上标准清晰度以外的0-255之外)。这些通常被“剪辑”(即限制)到受影响频道的有效范围。这改变了颜色的色调,这是非常不希望的,所以通常认为对不合适的颜色进行去饱和更好。同样,当RGB在相同的位深度时,几个RGB颜色变成相同的YUV颜色,导致信息丢失。

    Y'CbCr的关系

    YUV通常用作YCbCr的术语。但是,它们是不同比例因子的完全不同的格式。[10]

    尽管如此,标准案例中它们之间的关系很简单。尤其是,Y通道在两者中都相同,Cb和U都与(B-Y)成比例,并且Cr和V都与(R-Y)成比例。
    抽样类型

    为了获得数字信号,YUV图像可以以几种不同的方式进行采样;请参阅色度子采样。
    Y'UV和RGB之间转换

    RGB文件通常以每像素8,12,16或24位编码。在这些例子中,我们假定每像素24位,写为RGB888。标准的字节格式是:

    r0,g0,b0,r1,g1,b1,...

    YUV文件可以按每个像素12,16或24位编码。常用格式为Y'UV444(或YUV444),YUV411,Y'UV422(或YUV422)和Y'UV420p(或YUV420)。 Y之后的撇号被省略,YUV420p之后的“p”也被省略。就实际文件格式而言,YUV420是最常见的,因为数据更容易压缩,文件扩展名通常是“.YUV”。

    数据速率和采样之间的关系(A:B:C)由Y与U和V通道之间的比率定义[11] [12]

    要从RGB转换到YUV或后面,最简单的方法就是使用RGB888和YUV444。对于YUV411,YUV422和YUV420,首先需要将字节转换为YUV444。

     

    Y'UV444转换为RGB888

    函数[R,G,B] = Y'UV444toRGB888(Y',U,V)将YUV格式转换为简单的RGB格式。

    Y'UV444格式的RGB转换公式也适用于YUV420(或YUV422)的标准NTSC电视传输格式。 对于YUV420,由于每个U或V采样用于表示形成正方形的4个Y采样,因此可以使用适当的采样方法。 有关更多详细信息,请参阅本文底部的420格式演示。

    这些公式基于NTSC标准:

     

    在较老的非SIMD架构中,浮点运算比使用定点算法慢得多,所以另一种公式是:[13]

     

    使用系数C,D和E从Y'UV到RGB的转换并注意到钳位()版本):

     

    注意:上述公式实际上是暗示的YCbCr。 尽管这里使用了YUV这个术语,但应该指出,YUV和YCbCr在严格的方面并不完全一样。

    ITU-R版本的公式不同:

     

    ITU-R YCbCr标准(每通道8位)到RGB888的整数运行:

     

    Y'UV422转换为RGB888

         输入:读取Y'UV的4个字节(u,y1,v,y2)
         输出:写入6个字节的RGB(R,G,B,R,G,B)

     

    使用这些信息可以将其解析为常规Y'UV444格式以获得2个RGB像素信息:

     

    因此Y'UV422可以用YUY2 FourCC格式代码表示。 这意味着将在图像中处理的每个巨像素(4个字节)中定义2个像素。

     

    Y'UV411到RGB888转换

         输入:读取Y'UV的6个字节
         输出:写入12个字节的RGB

     

    所以结果是6个字节的4个RGB像素值(4 * 3字节)。这意味着将传输数据的大小减少到一半,质量下降。
    Y'UV420p(和Y'V12或YV12)转换为RGB888

    Y'UV420p是一种平面格式,这意味着Y',U和V值被分组在一起而不是散布在一起。其原因是通过将U和V值分组在一起,图像变得更加可压缩。当以Y'UV420p格式给出一组图像时,所有的Y'值先出现,然后是所有的U值,最后是所有的V值。

    Y'V12格式与Y'UV420p基本相同,但它具有U和V数据切换:Y值后跟V值,U值保持不变。来自适当位置的U和V值,Y'UV420p和Y'V12都可以使用相同的算法进行处理。

    与大多数Y'UV格式一样,由于有像素,所以有很多Y'值。在X等于高度乘以宽度的情况下,阵列中的前X个索引是对应于每个单独像素的Y'值。但是,U和V值只有四分之一。 U和V值相互对应。在Y'值之后,下一个X / 4索引是每个2×2块的U值,并且之后的下一个X / 4索引是应用于每个2×2块的V值。

    与以前的格式相比,将Y'UV420p转换为RGB是一个更复杂的过程。可以使用以下方法查找Y',U和V值:

     

     

    Y'UV420分别以顺序模块编码。 为每个像素存储Y'值,然后针对每个2×2方块像素存储U值,并且最后针对每个2×2块存储V值。 对应的Y',U和V值在上图中使用相同的颜色显示。 从设备逐行读取字节流,Y块位于位置0,位于x×y位置的U块(在本例中为6×4 = 24),V块位于位置x ×y +(x×y)/ 4(这里,6×4 +(6×4)/ 4 = 30)。
    Y'UV420sp(NV21)到RGB转换(Android)

    此格式(NV21)是Android相机预览中的默认图片格式。 YUV 4:2:0平面图像,其中8位Y采样,然后是带有8位2x2二次采样色度采样的交错V / U平面[14]。

    Android上用于转换YUVImage像素的C ++代码:[15]


    展开全文
  • YUV--YUV.doc

    2021-02-08 10:27:37
    YUV
  • YUV View YUV播放器

    2021-10-22 22:02:18
    功能比较强大的YUV播放器,可以看到YUV的像素值,也可以进行划分
  • YUV1.3播放器播放YUV

    2021-05-16 09:51:18
    播放YUV
  • YUVPlayer YUV播放器

    2018-03-19 14:21:17
    YUVPlayer YUV播放器 播放YUV文件的工具,开发音视频必备工具
  • yuvviewer,yuv播放器

    2020-12-16 14:12:12
    yuvviewer,yuv播放器,支持播放各种格式的yuv,nv12,nv,i420
  • android平台下基于Camera详解NV21(YUV420P)、NV12(YUV420SP)和RGBA、RGB、BGRA、BGR 概述 NV21 参考: https://blog.csdn.net/leixiaohua1020/article/details/50534150 ...

    音视频实践学习

    概述

    YUV模型是根据一个亮度(Y分量)和两个色度(UV分量)来定义颜色空间,常见的YUV格式有YUY2、YUYV、YVYU、UYVY、AYUV、Y41P、Y411、Y211、IF09、IYUV、YV12、YVU9、YUV411、YUV420等,其中比较常见的YUV420分为两种:YUV420P和YUV420SP

    我们在android平台下使用相机默认图像格式是NV21属于YUV420SP格式

    YUV采样

    YUV 4:4:4采样,每一个Y对应一组UV分量,一个YUV占8+8+8 = 24bits 3个字节。
    YUV 4:2:2采样,每两个Y共用一组UV分量,一个YUV占8+4+4 = 16bits 2个字节。
    YUV 4:2:0采样,每四个Y共用一组UV分量,一个YUV占8+2+2 = 12bits 1.5个字节。
    

    我们最常见的YUV420P和YUV420SP都是基于4:2:0采样的,所以如果图片的宽为width,高为heigth,在内存中占的空间为width * height * 3 / 2,其中前width * height的空间存放Y分量,接着width * height / 4存放U分量,最后width * height / 4存放V分量

    YUV420P(YU12和YV12)格式

    YUV420P又叫plane平面模式Y , U , V分别在不同平面,也就是有三个平面,它是YUV标准格式4:2:0,主要分为:YU12和YV12

    • YU12格式

    android平台下也叫作I420格式,首先是所有Y值,然后是所有U值,最后是所有V值

    YU12:亮度(行×列) + U(行×列/4) + V(行×列/4)

    • YV12格式

    YV12格式YU12基本相同,首先是所有Y值,然后是所有V值,最后是所有U值。只要注意从适当的位置提取U和V值YU12和YV12都可以使用相同的算法进行处理。

    YV12:亮度Y(行×列) + V(行×列/4) + U(行×列/4)

    YU12: YYYYYYYY UUVV    =>    YUV420P
    YV12: YYYYYYYY VVUU    =>    YUV420P
    

    YUV模型是根据一个亮度(Y分量)和两个色度(UV分量)来定义颜色空间,常见的YUV格式有YUY2、YUYV、YVYU、UYVY、AYUV、Y41P、Y411、Y211、IF09、IYUV、YV12、YVU9、YUV411、YUV420等,其中比较常见的YUV420分为两种:YUV420P和YUV420SP。

    我们在android平台下使用相机默认图像格式是NV21属于YUV420SP格式## YUV420SP(NV21和NV12)格式

    YUV420SP格式的图像阵列,首先是所有Y值,然后是UV或者VU交替存储,NV12和NV21属于YUV420SP格式,是一种two-plane模式,即Y和UV分为两个plane,但是UV(CbCr)为交错存储,而不是分为三个平面。

    • NV21格式

    android手机从摄像头采集的预览数据一般都是NV21,存储顺序是先存Y,再VU交替存储,NV21存储顺序是先存Y值,再VU交替存储:YYYYVUVUVU,以 4 X 4 图片为例子,占用内存为 4 X 4 X 3 / 2 = 24 个字节

    • NV12格式

    NV12与NV21类似,也属于YUV420SP格式,NV12存储顺序是先存Y值,再UV交替存储:YYYYUVUVUV,以 4 X 4 图片为例子,占用内存为 4 X 4 X 3 / 2 = 24 个字节

    注意:在DVD中,色度信号被存储成Cb和Cr(C代表颜色,b代表蓝色,r代表红色)

    NV12: YYYYYYYY UVUV    =>YUV420SP
    NV21: YYYYYYYY VUVU    =>YUV420SP
    

    YUV和RGB转换

    Y      =  (0.257 * R) + (0.504 * G) + (0.098 * B) + 16
    Cr = V =  (0.439 * R) - (0.368 * G) - (0.071 * B) + 128
    Cb = U = -(0.148 * R) - (0.291 * G) + (0.439 * B) + 128
    
    B = 1.164(Y - 16) + 2.018(U - 128)
    G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128)
    R = 1.164(Y - 16) + 1.596(V - 128)
    

    分离YUV420P

    下面基于实例来理解Y,U,V分量的作用

    先使用ffmpeg将指定的图片转为yuv420p格式

    ffmpeg -i input.jpg -s 510x510 -pix_fmt yuv420p input.yuv
    
    • 分离YUV分量

    笔者使用的Clion直接运行下面这段代码,分离出所需的文件

    void split_yuv420(char *inputPath, int width, int height) {
    
        FILE *fp_yuv = fopen(inputPath, "rb+");
    
        FILE *fp_y = fopen("output_420_y.y", "wb+");
        FILE *fp_u = fopen("output_420_u.y", "wb+");
        FILE *fp_v = fopen("output_420_v.y", "wb+");
    
        unsigned char *data = (unsigned char *) malloc(width * height * 3 / 2);
    
        fread(data, 1, width * height * 3 / 2, fp_yuv);
        //Y
        fwrite(data, 1, width * height, fp_y);
        //U
        fwrite(data + width * height, 1, width * height / 4, fp_u);
        //V
        fwrite(data + width * height * 5 / 4, 1, width * height / 4, fp_v);
    
        //释放资源
        free(data);
    
        fclose(fp_yuv);
        fclose(fp_y);
        fclose(fp_u);
        fclose(fp_v);
    }
    

    笔者使用的是ubuntu系统,因此运行yuvplayer.exe文件,需要提前安装好winesudo apt install wine,运行yuvplayer之后,需要先设置像素格式为Y,否则你看到的图像可能会有问题

    先看output_420_y.y文件:(分辨率设置为510x510)

    output_420_u.y显示如下:(分辨率设置为255x255)

    output_420_v.y显示如下:(分辨率设置为255x255)

    • 生成灰度图

    上面的例子实际上已经生成了一个灰度图了,但是只保留了Y分量,你如果直接用ffplay工具查看会有问题,下面的函数将会生成一个标准的YUV文件并且保留Y分量,你可能会有疑问,为什么U分量和V分量要写入0x80,其实你可以参考上面的YUV转RGB的公式,YUV数据是无法直接显示的,最终需要转成RGB显示,因此我这里是只需要保留Y分量,忽略UV分量的影响,因此根据上面的公式,我在U和V分量中都写入128就是十六进制的0x80

    • 保留Y分量(生成灰度图)
    void yuv420p_y(char *inputPath, char *outputPath, int width, int height) {
    
        FILE *inFile = fopen(inputPath, "rb+");
        FILE *outFile = fopen(outputPath, "wb+");
    
        unsigned char *data = (unsigned char *) malloc(width * height * 3 / 2);
    
        fread(data, 1, width * height * 3 / 2, inFile);
    
        //Y分量
        fwrite(data, 1, width * height, outFile);
    
        unsigned char *buffer = (unsigned char *) malloc(width * height / 4);
        memset(buffer, 0x80, width * height / 4);
        //U分量
        fwrite(buffer, 1, width * height / 4, outFile);
        //V分量
        fwrite(buffer, 1, width * height / 4, outFile);
    
        free(buffer);
        free(data);
        fclose(inFile);
        fclose(outFile);
    }
    
    int main() {
    
        yuv420p_y("/home/byhook/media/input.yuv", "/home/byhook/media/output.yuv", 510, 510);
    
        return 0;
    }
    

    使用ffplay来播放yuv格式的文件:

    ffplay -f rawvideo -video_size 510x510 output.yuv
    

    要注意这里的分辨率不能错

    分离YUV422P

    YUV422P基于YUV 4:2:2采样,每两个Y共用一组UV分量,一个YUV占8+4+4 = 16bits 2个字节。分离代码如下:

    void split_yuv422(char *inputPath, int width, int height) {
    
        FILE *fp_yuv = fopen(inputPath, "rb+");
    
        FILE *fp_y = fopen("output_422_y.y", "wb+");
        FILE *fp_u = fopen("output_422_u.y", "wb+");
        FILE *fp_v = fopen("output_422_v.y", "wb+");
    
        unsigned char *data = (unsigned char *) malloc(width * height * 2);
    
        fread(data, 1, width * height * 2, fp_yuv);
        //Y
        fwrite(data, 1, width * height, fp_y);
        //U
        fwrite(data + width * height, 1, width * height / 2, fp_u);
        //V
        fwrite(data + width * height * 3 / 2, 1, width * height / 2, fp_v);
    
        //释放资源
        free(data);
    
        fclose(fp_yuv);
        fclose(fp_y);
        fclose(fp_u);
        fclose(fp_v);
    }
    

    分离YUV444P

    YUV444P基于YUV 4:4:4采样,每一个Y对应一组UV分量,一个YUV占8+8+8 = 24bits 3个字节。分离代码如下:

    void split_yuv444(char *inputPath, int width, int height) {
    
        FILE *fp_yuv = fopen(inputPath, "rb+");
    
        FILE *fp_y = fopen("output_444_y.y", "wb+");
        FILE *fp_u = fopen("output_444_u.y", "wb+");
        FILE *fp_v = fopen("output_444_v.y", "wb+");
    
        unsigned char *data = (unsigned char *) malloc(width * height * 3);
    
        fread(data, 1, width * height * 3, fp_yuv);
        //Y
        fwrite(data, 1, width * height, fp_y);
        //U
        fwrite(data + width * height, 1, width * height, fp_u);
        //V
        fwrite(data + width * height * 2, 1, width * height, fp_v);
    
        //释放资源
        free(data);
    
        fclose(fp_yuv);
        fclose(fp_y);
        fclose(fp_u);
        fclose(fp_v);
    }
    

    参考:
    https://blog.csdn.net/leixiaohua1020/article/details/50534150
    https://en.wikipedia.org/wiki/YUV

    展开全文
  • 图片的 RGB 转为YUV格式,输出到 *.txt 和 *_444.yuv文件% 3. 将YUV4:4:4 转为 YUYV4:2:2 packed,输出数据到 *_422yuyv.yuv% 4. 将YUV4:4:4 转为 4:2:0 planar,输出数据到 *_420yv12.yuv% 文件将被输出到创建的 ....
  • 各种YUV播放器各种YUV播放器
  • YUV Player

    2020-09-17 18:30:20
    自己修改过的YUV播放器,支持RGB、YUV等格式的播放。 自己修改过的YUV播放器,支持RGB、YUV等格式的播放。
  • YUV播放器和YUV片源

    2018-07-07 21:54:36
    YUV作为一种原始码流标准,研究它的播放特性,以及YUV到RGB的相互转换有重要意义。本资源提供YUV的播放器和一些YUV格式的片源供大家研究。
  • 可以直接打开 YUV NV21 NV12 YUV420 YUV444 YUV422 RGB16 RGB24 RGB32 RGBA等格式的从内存中直接保存的原始无压缩图片
  • 7yuvyuv图片查看器

    2021-04-02 16:04:49
    yuv图片查看器
  • yuv分析软件_7yuv

    2021-01-28 10:39:35
    软件名称:7yuv 用途:一个非常好用的查看yuv格式数据的软件,不需要注册。 相关使用介绍可以查看文章: Android Camera开发系列:分析音视频用到的一些软件: ...
  • yuv420拼接源码实现

    2021-08-06 10:45:00
    yuv
  • YUV转换显示编辑工具YUV420.YUV422
  • YUVPlayer-YUV播放器

    2016-05-18 12:47:54
    自己写的YUV播放器,支持格式: YUV400,界面中表示为Y。 YUV420平面格式:YUV420(I420);YV12; YUV422平面格式:YUV422(I422);YV16; YUV444格式:YUV444; YUV422交织格式:YUY2(YUYV);YVYU;UYVY;VYUY; 半平面格式:...
  • yuv420p转yuv422

    2017-09-15 14:43:13
    实现yuv之间的转换实现, 可以将yuv420p转换成yuv422, 可以将yuv422转换成uyvy, 可以将yuv420p转换成uyvy 。
  • bmp转yuv (bmp2yuv

    2020-09-03 07:30:16
    bmp转yuv的程序,学习视频处理的基础。 bmp转yuv的程序,学习视频处理的基础。 bmp转yuv的程序,学习视频处理的基础。 bmp转yuv的程序,学习视频处理的基础。
  • 轻量级YUV播放器,支持各种YUV格式 支持格式 平面格式 YUV420(YV12) YUV422(YV16) YUV444 RGB16 RGB24 RGB32 交错格式 NV12 NV21 尤维 维尤 配套功能 变焦(4:1〜1:4) 将帧存储到YUV / BMP 热键 ...
  • 将bmp图片文件或者jpg图片文件转化为yuv数据,默认转化为NV12.

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 50,108
精华内容 20,043
关键字:

yuv