FFMPEG-基础

1字节由8位组成,可以表示256(即28)种状态。也就是说1字节可以表示256种颜色。如果是灰度图像,则表示256种不同的灰度。表示颜色所使用的位数就称为颜色的位深。彩色图像通常以R、G、B三色表示,每个单色分别计算位深。我们常说的24位真彩色就是3种位深为8的R、G、B颜色的混合,可以表示16 777 216(即224)种颜色。

常见的有10位位深,表示一个RGB像素需要30位,将近4字节。随着4K、8K视频的出现,以及人们对图像质量越来越高的要求,也出现了12位、16位的位深格式。16位位深的RGB像素(每种颜色分量占2字节)需要6字节的存储空间。

FourCC
全称是Four Character Code,即4个字符编码,为了表示不同的图像类型和像素排列格式。FourCC代码是一个32位无符号整数,使用大端序编码4个ASCII字符序列。RGBA、ARGB等都是FourCC。
FFmpeg使用MKTAG宏定义了一些类似FourCC的代码,不过没有完整的FourCC列表,FFmpeg内部也没有各种图像格式与FourCC的一一对应关系,有助于我们理解各种像素格式,以及不同系统中图像格式的对应关系。

YUV诞生于黑白电视向彩色电视过渡的时期,黑白视频是只有Y(Luma或Luminance,即亮度)分量的视频,也就是灰阶值,在彩色电视中,除了Y以外,还使用U和V来表示图像的色度(Chrominance或Chroma,C)。U和V也分别称为Cb、Cr,分别代表蓝色通道和红色通道与亮度的差值。YUV也就是YCbCr

YUV图像可以由RGB图像转换而来

注意,数字视频中的YUV值通常不是全值域的,即一般每个分量的取值范围为16~235,而不是0~255。在FFmpeg中,YUV420P像素格式就不是全值域的,而YUVJ420P则是。
相对于Y来说,人眼对UV不大敏感,因此,可以在图像存储时降低UV分量的分辨率(采样率),以节省存储空间,而这种降采样后的图像看起来与原图像没有多大差别。

YUV444表示4:4:4的YUV取样,水平每4像素中YUV各取4个,即每像素中YUV各取1个。所以每1×1像素Y占1字节,U占1字节,V占1字节,YUV444格式下平均每像素占(1+1+1)× 8bit/1pix = 24bpp(bpp为Bit Per Pixel,即每像素位数),即3字节。那么352×288分辨率的一帧图像占用的存储空间为352×288×24/8 = 304 128 (字节)。这种格式实际上是一种全采样格式,它与RGB格式的图像占用相同的存储空间。

YUV422表示4:2:2的YUV取样,水平每2像素(即2×1的2像素)中Y取样2个,U取样1个,V取样1个,所以每2×1像素Y占2字节,U占1字节,V占1字节,YUV422格式下平均每像素占(2+1+1)×8bit/2pix = 16bpp。那么352×288分辨率的一帧图像占用的存储空间为352×288× 16/8 = 202 752 (字节)。

YUV420表示4:2:0的YUV取样,水平每2像素与垂直每2像素(即2×2的2像素)中Y取样4个,U取样1个,V取样1个,所以每2×2像素Y占4字节,U占1字节,V占1字节,YUV420格式下平均每像素占(4+1+1) × 8bit/4pix = 12bpp。那么 352×288 分辨率的一帧图像占用的存储空间为352×288×12/8 = 152 064 (字节),相比YUV444格式正好节约一半的空间。

YUVI420,其实就是把邻近的4像素(2×2,即当前像素、右、下、右下)都用同一个U和V,而原先的Y不变。正是基于这个原因,一般的编码器都要求原始图像的宽和高是偶数。除此之外,编码器一般会将图像划分成 2×2、4×4、8×8、16×16 等块进行各种预测和比较。常见的H.264、H.265、VP8、AV1等都是以它为基础进行编解码的。

还有一种YV12格式,与I420的区别是U和V平面的顺序相反,在安卓系统中,普遍使用NV12的像素格式,它与I420格式相比,Y平面没有区别,但U和V平面像素是交错存储的,是一种“半平面半交错”的存储方式。

使用8位位深对RGB像素进行编码,每像素需要24位,这是当前主流的标准表示方法,用于真彩色与JPEG或者TIFF等图像文件格式里的通用颜色交换。

RGB常见的展现方式分16位模式和32位模式。16位模式通常由RGB565、BGR565、ARGB1555、BGR1555等不同的模式表示,其中的数字表示色彩对应的位数。一般每种原色各为5位,多出的1位分给绿色,因此绿色变为6位,这主要是因为人眼对绿色更敏感。

32位模式(也称为ARGB8888)实际就是24位模式,余下的8位不用于表示颜色,这种模式是为了提高数据处理的速度(每像素正好对应一个32位整数)。同样在一些特殊情况下,如DirectX、OpenGL等环境,余下的8位用来表示像素的透明度(Alpha)。

HSL和HSV一般更适合人的色彩感知,而RGB更适合应用于显示领域。
HSL即色相(Hue)、饱和度(Saturation)、亮度(Lightness),HSV即色相(Hue)、饱和度(Saturation)、明度(Value),又称HSB,其中B即英语Brightness的首字母。色相(H)是色彩的基本属性,就是平常所说的颜色名称,如红色、黄色等。饱和度(S)是指色彩的纯度,越高则色彩越纯,越低则逐渐变灰,取值范围为0~100%。明度(V)、亮度(L)的取值范围为0~100%。

视频逐行和隔行扫描、NTSC与PAL制式

假设使用CRT显示器,那么如果不使用隔行扫描,就需要采用下面的方式之一

  • 将传输频宽加倍,按帧而不是按场传输图像。这能够提高图像品质,提供的有效分辨率和闪烁速率是相同的。
  • 使用相同的传输频宽,按帧传输分辨率为原来一半的图像。这时候图像细节少了,闪烁速率仍旧相同。
    使用相同的传输频宽,按帧传输图像,但是帧率为隔行扫描场率的一半。这时闪烁速率降低一半,眼睛
    非常容易产生疲劳
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容