我完全理解所讨论的NV12格式的大小
现在,我从两个来源阅读有关UV平面的这种格式的存储:一个是https://msdn.microsoft.com/en-us/library/windows/desktop/dd206750(v=vs.85).aspx。
NV12
所有的Y样本首先出现在内存中,作为一个无符号字符值数组,其行数为偶数。Y平面后面紧跟着一个包含填充U (Cb)和V (Cr)样本的无符号字符值阵列。当组合的U数组被寻址为一个小端点字值数组时,LSB包含U值,MSB包含V值。NV12是DirectX VA的首选4:2:0像素格式。预计这将是支持4:2:0视频的DirectX VA加速器的中期要求.下图显示了Y平面和包含填充U和V样本的数组。
我所理解的是:在UV平面中,每个U和V都存储在单字节中。
当我从维基百科上读到这个:https://wiki.videolan.org/YUV#NV12
上面写着:
NV12
与I420相关的是,NV12有一个luma“亮度”平面Y和一个U和V值交错的平面。在NV12中,色度平面(蓝色和红色)在水平和垂直尺度上都被细分为2倍。对于2x2组像素,有4个Y样本和1U和1V样本。将NV12看作具有U面和V面交错的I420是有帮助的。下面是NV12的图形表示。每个字母代表一位:对于1 NV12像素: YYYYYYYY UVUV代表2像素NV12帧: YYYYYYYYYYYYYYYY代表50像素NV12帧: Y*8*50 (UV)*2*50用于n像素NV12帧: Y*8*n (UV)*2*n
我在这里所理解的是:,每个U和V在每个字节中被一点一点地交错。因此,UV平面的每一个字节都将包含4U位和4V位交织。
有人能澄清我的疑虑吗?
发布于 2015-07-19 09:33:24
TL;DR: MSDN是正确的
要验证这一点(或者至少验证在位级别上没有交织),可以使用ffmpeg,这是一个广泛使用的视频工具。我做了以下实验:
ffmpeg把它读成一个小尺寸的I420视频帧ffmpeg将其转换为NV12格式下面是用于(2)和(3)的命令行示例:
ffmpeg -s 96x4 -i example_i420.yuv -pix_fmt nv12 example_nv12.yuv下面是我在输出中得到的内容:
我也是一样的,神圣的,神圣的,不受诱惑的,不受诱惑的。Ut enim ad minim veniam,quis nostrud习服ullamco laboris aliquip ex ea commodo .在无名氏荒凉的地方,我们要谴责天鹅绒和毛毛虫。我的名字是:. bLoorree .cUotn seenci
我用粗体标记色度(U和V)。很明显,这些值(ASCII字母)是相同的,只是按无序排列。如果执行任何位交错操作,我会得到不同的值。
因此,VLC wiki中的描述(BTW是而不是维基百科)是不正确的。名为"Edwardw“的人添加了提到像素here的”插图“,然后将其更改为"bits”here。我希望有人修改它,以减少误导性( wiki需要注册,所以我不能编辑它)。
https://stackoverflow.com/questions/31426515
复制相似问题