該節(jié)是ffmpeg開發(fā)播放器學習筆記
的第三節(jié)《認識YUV》
簡單的講YUV是一種圖像和視頻的編碼方式,RGB通過三種顏色來表達現(xiàn)實世界中的各種顏色似炎,YUV通過亮度與色度飽和度來表示顏色账胧。
RGB很好理解,它更直觀。從學生開始就認識繪畫的顏料是用三種顏色調(diào)配來的,汽車的油漆顏色也是RGB三種顏色調(diào)配而來的萨螺。
YUV的出現(xiàn)有它的歷史意義但也是一種必然。它基于人眼對亮度的敏感度比色彩的敏感度更高的特點廊散。Y表示亮度也可以理解在灰度值枣购,最低的亮度就是黑色最高的亮度就是白色娶耍,中間的可呈現(xiàn)出灰色免姿。
在黑白電視機向彩色電視機過渡的年代,黑白電視機只需要YUV中的一個分量Y就可以呈現(xiàn)出黑白畫面。UV分量用在彩色電視機上即可呈現(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é) - 認識YUV ?? 第四節(jié) - 硬解碼,OpenGL渲染YUV
?? 第五節(jié) - Metal 渲染YUV
?? 第六節(jié) - 解碼音頻,使用AudioQueue 播放
?? 第七節(jié) - 音視頻同步
?? 第八節(jié) - 完善播放控制
?? 第九節(jié) - 倍速播放
?? 第十節(jié) - 增加視頻過濾效果
?? 第十一節(jié) - 音頻變聲
實例代碼提供了Objective-C
與Swift
兩種實現(xiàn),為了方便說明,文章引用的是Objective-C
代碼,因為Swift
代碼指針看著不簡潔。
目標
- 了解YUV采樣方式
- 了解YUV存儲方式
了解YUV采樣方式
4:4:4采樣
每一個Y都對應(yīng)一組UV刚陡,這種采樣方式與RGB比較類似惩妇。這種采樣方式保留了所有的細節(jié),亮度與色度都保留了,所以壓縮率很低筐乳,但是好處是還原后的圖像也就完美歌殃。它最要用在對帶寬要求不高并且對圖像質(zhì)量特點是細節(jié)要求高的場景。對于4:4:4的采樣方式來講,采樣編碼與蝙云,存儲氓皱,還原都一樣。4:2:2
4:2:2采樣方式意思就是4個Y對應(yīng)兩組UV勃刨,即2個Y對應(yīng)一組UV的方式進行采樣波材。進行還原的時候也是每相鄰的兩個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個像素點組合。
了解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é):
? 認識YUV订咸,了解了YUV的歷史由來曼尊。
? 分別詳細介紹了4種不同的YUV采樣方式,了解了每一種采樣方式的特點與壓縮比
? YUV存儲分兩類,打包與扁平。打包方式是將數(shù)據(jù)存放到一個平臺,可以交叉也可以一個分量數(shù)據(jù)存儲完之后再存另一個分量脏嚷。扁平方式將數(shù)據(jù)分別存到不同的平面骆撇。
更多內(nèi)容請關(guān)注微信公眾號<<程序猿搬磚>>