图像的基础
像素、分辨率 和RGB的基本概念。
RBG888是24位的,RGBA是32位的。
数据和图像的关系
图像是数据,屏幕是显示设备,图像数据经过驱动程序让屏幕显示图像。Bitmap是BGR格式,若要现实,需将BGR数据转化为RGB数据。
PPI(pixels per inch),DPI(Dots pen inch),两者基本属于1:1的关系,PPI >300 属于视网膜级别。
分辨率
X轴像素个数✖️Y轴像素的个数。常见的宽高比16:9/4:3。常见的分辨率:360P/720P/1K/2K都是16:9的。
帧率
每秒钟采集/播放的图像个数,动画基本在25帧/s,常见的帧率:15帧/s、30帧/s、60帧/s。
未编码的RGB码流
RGB码流 = 分辨率(宽✖️高)✖️ 3(Byte)* 帧率
YUV
YUV,也称YCbCr,Y表示明亮程度,UV的作用是描述影像色彩的饱和度。主要采样格式有YUV4:2:0、YUV4:2:2、YUV4:4:4。
原始图像
YUV的Y分量
YUV的U分量
YUV的V分量
RGB与YUV的关系
RGB用于屏幕图片的展示,而YUV用于采集与编码。RGB与YUV可以相互转化。
YUV格式
4:2:0并不意味着只有Y、Cb两个分量,而没有Cr分量。它实际指的是对每行扫描线来说,只有一种色度分量,它以2:1的抽样率存储。相邻的扫描行存储不同的色度分量,也就是说,如果一行是4:2:0的
话,下一行就是4:0:2 ,再下一行是4:2:0..以此类推。
YUV4:4:4
YUV4:2:2
YUV4:2:0
YUV数据量的计算
YUV = Y * 1.5,Y分量的1.5倍,YUV = RGB/2,是RGB数据的一半。
YUV4:2:0的存储格式
每一个Y的前四项对应一个U和V。
它的存储格式
planar(平面)
I420: YYYYYYYY UU VV =======>YUV420P
YV12: YYYYYYYY VV UU =======>YUV420P (常用于IOS)
packed(打包)
NV12:YYYYYYYY UVUV =======>YUV420SP
NV12:YYYYYYYY VUVU =======>YUV420SP(常用于Android)
YUV码流 = 分辨率(宽✖️高)✖️1.5✖️帧率
使用ffmpeg生成YUV
ffmpeg -i input.mp4 -an -c:v rawvideo -pix_fmt yuv420p out.yuv
使用ffplay播放YUV
ffplay -pix_fmt yuv420p -s 1280x544 out.yuv
这里的1280x544是视频分辨率,这个信息可以在生成yuv时,ffmpeg会显示出来。
使用ffplay播放Y分量
ffplay -pix_fmt yuv420p -s 1280x544 -vf extractplanes='y' demovideo.yuv
使用ffmpeg提取各分量
ffmpeg -i demovideo.mp4 -filter_complex 'extractplanes=y+u+v[y][u][v]' -map '[y]' demovideo_y.yuv -map '[u]' demovideo_u.yuv -map '[v]' demovideo_v.yuv