該節(jié)是ffmpeg開發(fā)播放器學(xué)習(xí)筆記的第三節(jié)《認(rèn)識YUV》
簡單的講YUV是一種圖像和視頻的編碼方式,RGB通過三種顏色來表達(dá)現(xiàn)實(shí)世界中的各種顏色,YUV通過亮度與色度飽和度來表示顏色。
RGB很好理解,它更直觀。從學(xué)生開始就認(rèn)識繪畫的顏料是用三種顏色調(diào)配來的,汽車的油漆顏色也是RGB三種顏色調(diào)配而來的。
YUV的出現(xiàn)有它的歷史意義但也是一種必然。它基于人眼對亮度的敏感度比色彩的敏感度更高的特點(diǎn)。Y表示亮度也可以理解在灰度值,最低的亮度就是黑色最高的亮度就是白色,中間的可呈現(xiàn)出灰色。
在黑白電視機(jī)向彩色電視機(jī)過渡的年代,黑白電視機(jī)只需要YUV中的一個分量Y就可以呈現(xiàn)出黑白畫面。UV分量用在彩色電視機(jī)上即可呈現(xiàn)出彩色了。YUV可以帶來更高的幀內(nèi)壓縮比,由于人眼對黑白更敏感,YUV可以弱化不敏感的信息,減少UV分量的采樣。RGB24的每個像素需要3*8個字節(jié),YUV呢?不同的YUV采樣方式壓縮比有所不同。
電視信息使用的是YUV而數(shù)字信息使用的是YCrCb命令,以下統(tǒng)稱YUV。
? 第一節(jié) - Hello FFmpeg
? 第二節(jié) - 軟解視頻流,渲染 RGB24
?? 第三節(jié) - 認(rèn)識YUV ?? 第四節(jié) - 硬解碼,OpenGL渲染YUV
?? 第五節(jié) - Metal 渲染YUV
?? 第六節(jié) - 解碼音頻,使用AudioQueue 播放
?? 第七節(jié) - 音視頻同步
?? 第八節(jié) - 完善播放控制
?? 第九節(jié) - 倍速播放
?? 第十節(jié) - 增加視頻過濾效果
?? 第十一節(jié) - 音頻變聲
實(shí)例代碼提供了Objective-C與Swift兩種實(shí)現(xiàn),為了方便說明,文章引用的是Objective-C代碼,因?yàn)?code>Swift代碼指針看著不簡潔。
目標(biāo)
- 了解YUV采樣方式
- 了解YUV存儲方式
了解YUV采樣方式
4:4:4采樣
每一個Y都對應(yīng)一組UV,這種采樣方式與RGB比較類似。這種采樣方式保留了所有的細(xì)節(jié),亮度與色度都保留了,所以壓縮率很低,但是好處是還原后的圖像也就完美。它最要用在對帶寬要求不高并且對圖像質(zhì)量特點(diǎn)是細(xì)節(jié)要求高的場景。對于4:4:4的采樣方式來講,采樣編碼與,存儲,還原都一樣。4:2:2
4:2:2采樣方式意思就是4個Y對應(yīng)兩組UV,即2個Y對應(yīng)一組UV的方式進(jìn)行采樣。進(jìn)行還原的時候也是每相鄰的兩個Y共享一組UV。這樣的采樣方式丟棄了部分色度數(shù)據(jù),還原的時候共享了色度,大部分圖像或者視頻中不敏感感覺不出來,但是在要求很高邊界清晰的圖像或者視頻里可能會看到原本銳利的邊界變得模糊了。4:1:1
在原始數(shù)據(jù)保持不變的情況下,4:1:1采樣壓縮率更高,但是丟棄的色度數(shù)據(jù)也更多,每個4個Y共享一組UV。4:2:0
4:2:0采樣并不是說Y采樣,U采樣2個V采樣0個。而是指第一行按2:1的比例采樣2個Y一個U,不采樣V。第二行采樣2個Y兩個V,不采樣U。
也可以說是水平采樣與垂直采樣。這樣采樣的結(jié)果就是相鄰相關(guān)的兩行按2x2的方式組合成了一個編碼組,每一個2X2包含6個數(shù)據(jù),還原成4個像素點(diǎn)組合。
了解YUV存儲方式
除了采樣方式與RGB不一樣,存在方式與RGB也有著差異,YUV有兩種存儲方式:打包與扁平。 打包存儲: YUV數(shù)據(jù)交叉連續(xù)存儲在一個平面上。 扁平存儲: Y,UV或者Y,U,V分別存儲在不同的平面。
不同的YUV格式有不同的存儲方式,這里以FFmpeg中420P舉例,YUV數(shù)據(jù)分別存儲在三個平面。他是這樣存儲的:
以上就是采樣與存儲的一些基礎(chǔ)知識。
對YUV有一定了解之后就可以開始渲染YUV數(shù)據(jù)幀了。
總結(jié):
? 認(rèn)識YUV,了解了YUV的歷史由來。
? 分別詳細(xì)介紹了4種不同的YUV采樣方式,了解了每一種采樣方式的特點(diǎn)與壓縮比
? YUV存儲分兩類,打包與扁平。打包方式是將數(shù)據(jù)存放到一個平臺,可以交叉也可以一個分量數(shù)據(jù)存儲完之后再存另一個分量。扁平方式將數(shù)據(jù)分別存到不同的平面。
更多內(nèi)容請關(guān)注微信公眾號<<程序猿搬磚>>