星期三, 5月 04, 2011

Week 13: 視訊格式 Video Format



  上個星期 (Week 12) 的課程內容介紹到如何存取視訊擷取視窗的緩衝區記憶體中的色彩資料, 但由於有一些同學的視訊裝置只提供 YUY2 的視訊格式, 因此執行範例程式 W12-SP 時, 就卡住了。為了解決這個問題, 這個星期, 我們就來討論: 什麼是視訊格式(Video Format)? YUY2 又是什麼?

1. 什麼是視訊格式(Video Format)?

  所謂的視訊格式, 其實指的就是視訊裝置所拍攝到的畫面(frame), 傳送近電腦歡緩衝區記憶體的資料流(串流) 的格式。最簡單的格式就是如下圖所示的 RGB 24, 其所代表的意義就是每個像素分別各用 8 個 bits 傳送紅 R、綠 G、藍 B 的色彩值, 一共需要 24 位元, 圖素(像素, pixel)位元深度為 24。

  下圖的畫面解析度設定為 320 * 240, 共有 76800 個像素, 每個像素需要 24 bits / 8 bites = 3 Bytes, 因此共需 76800 * 3 = 230400 Bytes 的緩衝區記憶體來儲存一個畫面的色彩資料。



  既然傳送的畫面資料本身是色彩值, 就可以有不同的色彩表示方法 (色彩模型, 色彩空間) 來表示一個顏色。RGB 是一種色彩表示方法, YUV 色彩模型 則是另一種常見的選擇。

  RGB 與 YUV 兩種色彩空間的轉換方法, 如下:

  
  

 在撰寫 RGB 與 YUV 兩種色彩空間的轉換程式時, 必須特別注意以下兩件事:

 a. 由於 U、V 色彩值可能為負數的情況, 為了儲存到 BYTE 的資料型態的記憶體中, 在儲存之前都會加上 128, 使之成為正數後再存放到記憶體中。

 b. 在電腦中 R、G、B 色彩值是用 BYTE 的正整數資料型態儲存, 適用可能範圍為 0 - 255, 然而, Y、U、V 經過轉換公式轉回 R、G、B 色彩值時, 卻有可能超出 0 - 255 之容許範圍, 所以, 存入前, 必須經過判斷後, 再放進記憶體, 以確保正確。

2. YUY2 視訊格式

 原本的 YUV 色彩空間每個像素依然需要 3 個位元組的記憶體空間來儲存色彩值, 為了更進一步節省傳輸及記憶體空間, YUY2 視訊格式便依照 "相鄰像素之色彩(UV)也會相近" 的特色, 讓 相鄰的兩個成對像素共用一組 U, V 色彩值, 所以視訊裝置傳送到緩衝區記憶體的色彩值便依序為

  YUYVYUYVYUYVYUYVYUYVYUYV...

 因此, 在撰寫 YUY2 的視訊處理程式時, 便要特別注意, 每次必須同時處理兩個像素, 一共 4 個 bytes。

3. 使用整數資料形態運算完成 RGB 與 YUV 色彩模型之轉換:
  MSDN: Converting Between YUV and RGB

4. www.FOURCC.org - for video codec and pixel format information.

  

 FOURCC 關於 YUV 與 RGB 的解釋比 維基百科上的資料有用多了! 這邊的討論觸及了格式與視訊標準, 對於程式開發來說, 確實比較有幫助。
 

 
 
 範例程式: W13-SP

沒有留言: