在网上可以很容易的找到YUV420的视频序列文件,这些文件都以.yuv作为后缀,文件存储的是一段视频的yuv420图像格式的一连串数据。文件中不包含视频和帧的尺寸及其他信息,只是纯图像数据。
首先,先阐释一下YUV420的采样格式。
其实并不是如字面那样的Y:U:V = 4:2:0,4:2:0并不意味着只有Y(Cb)而没有V(Cr)分量。420是对于每一条扫描线而言的,比如第一行扫描线的Y:U:V = 4:2:0,第二条扫描线的Y:U:V = 4:0:2。对于整幅图的采样来说,Y:U:V = 4:1:1。
如下图:
对于第一行来说,只有U,没有V;对于第二行来说,只有V,没有U;对于整幅图而言,Y:U:V = 4:1:1。
理解了420的采样格式后,就能够很容易地理解序列文件的存储。对于一帧图像来说,文件先写入全部的Y,再写入全部的U,再写入全部的V。值得注意的是,文件以左下角的像素点为起点,从左往右,从下往上写入。写完一帧接着再写下一帧。
另外,因为文件中并不包含尺寸信息,因此没有办法从文件本身获取。一般来说,可以通过文件名来进行判断。常见的几种尺寸如下例:
filename_pal.yuv 720x576
filename _vga.yuv 640x480
filename _cif.yuv 352x288
filename _qcif.yuv 176x144
了解了以上信息后,就可以读出每一帧图像的数据,从而还原一帧图像。还原图像时,如图中每四个像素共用一个U,一个V。
接下来还可以将YUV转成RGB,并将数据写入位图文件,就可以通过一般的图像工具打开了。
附:YUV转RGB转换关系:
r = 1.164*(y-16) + 1.596*(cr-128);
g = 1.164*(y-16) - 0.813*(cr-128) - 0.392*(cb-128);
b = 1.164*(y-16) + 2.017*(cb-12