天天看點

ffmpeg開發播放器學習筆記 - 認識YUV

作者:音視訊流媒體技術

該節是ffmpeg開發播放器學習筆記的第三節《認識YUV》

簡單的講YUV是一種圖像和視訊的編碼方式,RGB通過三種顔色來表達現實世界中的各種顔色,YUV通過亮度與色度飽和度來表示顔色。

RGB很好了解,它更直覺。從學生開始就認識繪畫的顔料是用三種顔色調配來的,汽車的油漆顔色也是RGB三種顔色調配而來的。

YUV的出現有它的曆史意義但也是一種必然。它基于人眼對亮度的敏感度比色彩的敏感度更高的特點。Y表示亮度也可以了解在灰階值,最低的亮度就是黑色最高的亮度就是白色,中間的可呈現出灰色。

在黑白電視機向彩色電視機過渡的年代,黑白電視機隻需要YUV中的一個分量Y就可以呈現出黑白畫面。UV分量用在彩色電視機上即可呈現出彩色了。 YUV可以帶來更高的幀内壓縮比,由于人眼對黑白更敏感,YUV可以弱化不敏感的資訊,減少UV分量的采樣。RGB24的每個像素需要3*8個位元組,YUV呢?不同的YUV采樣方式壓縮比有所不同。

電視資訊使用的是YUV而數字資訊使用的是YCrCb指令,以下統稱YUV。

ffmpeg開發播放器學習筆記 - 認識YUV

✅ 第一節 - Hello FFmpeg

✅ 第二節 - 軟解視訊流,渲染 RGB24

第三節 - 認識YUV

第四節 - 硬解碼,OpenGL渲染YUV

第五節 - Metal 渲染YUV

第六節 - 解碼音頻,使用AudioQueue 播放

第七節 - 音視訊同步

第八節 - 完善播放控制

第九節 - 倍速播放

第十節 - 增加視訊過濾效果

第十一節 - 音頻變聲

該節 Demo 位址:github.com/czqasngit/f…

執行個體代碼提供了Objective-C與Swift兩種實作,為了友善說明,文章引用的是Objective-C代碼,因為Swift代碼指針看着不簡潔。

目标

  • 了解YUV采樣方式
  • 了解YUV存儲方式

了解YUV采樣方式

4:4:4采樣

每一個Y都對應一組UV,這種采樣方式與RGB比較類似。這種采樣方式保留了所有的細節,亮度與色度都保留了,是以壓縮率很低,但是好處是還原後的圖像也就完美。它最要用在對帶寬要求不高并且對圖像品質特點是細節要求高的場景。 對于4:4:4的采樣方式來講,采樣編碼與,存儲,還原都一樣。

ffmpeg開發播放器學習筆記 - 認識YUV

4:2:2

4:2:2采樣方式意思就是4個Y對應兩組UV,即2個Y對應一組UV的方式進行采樣。進行還原的時候也是每相鄰的兩個Y共享一組UV。這樣的采樣方式丢棄了部分色度資料,還原的時候共享了色度,大部分圖像或者視訊中不敏感感覺不出來,但是在要求很高邊界清晰的圖像或者視訊裡可能會看到原本銳利的邊界變得模糊了。

ffmpeg開發播放器學習筆記 - 認識YUV

相關學習資料推薦,點選下方連結免費報名,先碼住不迷路~】

【免費分享】音視訊學習資料包、大廠面試題、技術視訊和學習路線圖,資料包括(C/C++,Linux,FFmpeg webRTC rtmp hls rtsp ffplay srs 等等)有需要的可以點選加群免費領取~

ffmpeg開發播放器學習筆記 - 認識YUV

4:1:1

在原始資料保持不變的情況下,4:1:1采樣壓縮率更高,但是丢棄的色度資料也更多,每個4個Y共享一組UV。

ffmpeg開發播放器學習筆記 - 認識YUV

4:2:0

4:2:0采樣并不是說Y采樣,U采樣2個V采樣0個。而是指第一行按2:1的比例采樣2個Y一個U,不采樣V。第二行采樣2個Y兩個V,不采樣U。

也可以說是水準采樣與垂直采樣。這樣采樣的結果就是相鄰相關的兩行按2x2的方式組合成了一個編碼組,每一個2X2包含6個資料,還原成4個像素點組合。

這樣的采樣方式與4:1:1有着相同的壓縮率。比起4:1:1的采樣方式,丢失的資料敏感度更低。

ffmpeg開發播放器學習筆記 - 認識YUV

了解YUV存儲方式

ffmpeg開發播放器學習筆記 - 認識YUV

以上就是采樣與存儲的一些基礎知識。

對YUV有一定了解之後就可以渲染YUV資料幀了。

總結:

• 認識YUV,了解了YUV的曆史由來。

• 分别詳細介紹了4種不同的YUV采樣方式,了解了每一種采樣方式的特點與壓縮比例

• YUV存儲分兩類,打包與扁平。打包方式是将資料存放到一個平台,可以交叉也可以一個分量資料存儲完之後再存另一個分量。扁平方式将資料分别存到不同的平面。

更多内容請關注微信公衆号<<程式猿搬磚>>

原文 https://juejin.cn/post/6917172687437561870

繼續閱讀