FFmpeg支持的像素格式非常多叔营,包括yuv420p
屋彪、yuyv422
、yuv422p
审编、yuv444p
撼班、yuv410p
、yuv420p9le
垒酬、yuvj411p
砰嘁、yuv420p16le
、yuv411p
等等勘究。在FFmpeg中使用AVPixelFormat
枚舉格式定義在在libavutil/pixfmt.h
文件中矮湘。
這些格式名稱中的字母都是啥意思呢,其實(shí)是有規(guī)律的口糕,沒必要去記缅阳。
p
:planar
,表示該格式采用線性存儲(chǔ)景描。
沒有p
就表示為packed
格式存儲(chǔ)十办。
le
:little-endian
,小端存儲(chǔ)超棺。
be
:big-endian
向族,大端存儲(chǔ)。
j
:jpeg
棠绘,表示每個(gè)像素的取值范圍跟jpeg
一樣是[0,255]
件相。如yuvj411p
再扭,取值范圍就是[0,255]
,0
表示黑色夜矗,255
表示白色泛范。而yuv411p
的像素顏色范圍是[16,235]
,16
表示黑色紊撕,235
表示白色
420
罢荡、422
、411
:這類數(shù)字表示分量的存儲(chǔ)比例逛揩,但是要注意的后面有0
和沒0
的區(qū)別柠傍,比如yuv420p
麸俘,y
辩稽、u
、v
分量的比例位4:2:0
从媚,這顯然是不科學(xué)的逞泄。真實(shí)的是y
分量位4
,uv
分量總和為2
拜效,因此實(shí)際比例是4:1:1
喷众,為什么命名為yuv420p
呢,其實(shí)這種命名是為了跟yuv411p
格式做區(qū)分紧憾,因?yàn)?code>yuv411p也是4:1:1
到千,只是他們的取樣方式不同,yuv420p
中的4
個(gè)y
是水平方向2
個(gè)y
赴穗,垂直方向2
個(gè)y
憔四,加起來一共4
個(gè)y
公用1
個(gè)u
,1
個(gè)v
般眉,而yuv411p
中的4
個(gè)y
都是水平方向的了赵。
p
后面的數(shù)字,如p10
表示一個(gè)分量使用10
位存儲(chǔ)甸赃,沒有數(shù)字就默認(rèn)是8
位柿汛。
這些在AVPixelFormat
枚舉中注釋中都有標(biāo)注
AV_PIX_FMT_YUV420P10BE,///< planar YUV 4:2:0, 15bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian
AV_PIX_FMT_YUVJ420P, ///< planar YUV 4:2:0, 12bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV420P and setting color_range
注釋中的2x2
意思就是水平方向2
個(gè)y
,垂直方向2
個(gè)y
埠对,Cr
就是u
分量络断,Cb
就是v
分量的意思,那這個(gè)15bpp
又是什么意思呢项玛,其實(shí)他是15 bit per pixel
的縮寫貌笨,就是表示1
個(gè)像素點(diǎn)有15
個(gè)bit
組成,這個(gè)其實(shí)是可以算出來的稍计,具體計(jì)算過程就是躁绸,沒4
個(gè)像素中,有4
個(gè)y
、1
個(gè)u
净刮、1
個(gè)v
剥哑,默認(rèn)每個(gè)分量采用10
位存儲(chǔ),那么4
個(gè)像素就有(4+1+1)*10=60
位淹父,那么1
個(gè)像素點(diǎn)就是60/4=15
個(gè)bit株婴。
知道了這些規(guī)律,那咱么只要看到像素的名稱暑认,就知道他的存儲(chǔ)方式了困介,知道每個(gè)像素占幾個(gè)bit了。
根據(jù)這個(gè)咱們來看個(gè)具體的像素格式蘸际。
yuva422p16le
采用planar
存儲(chǔ)座哩,一個(gè)分量是16
位使用小端模式存儲(chǔ),分量比例是4:2:2
粮彤,并且每個(gè)像素還存儲(chǔ)了透明度alpha根穷,那么每個(gè)像素就是(4+2+2+4)*16/4=48
個(gè)bit。