2011-12-19 59 views
0

在我們的應用中,我們需要傳輸視頻,我們使用Camera類捕獲緩衝和發送到目的地,Android的YUV圖像格式

我已經設置格式是YV12作爲相機參數來接收緩衝區,

爲爲500x300緩衝,我們收到的230400個字節的緩衝區,

我想知道,這是預期的緩衝區的大小?
相信大小將是

Y平面=寬×高=爲500x300 = 150000

Ù平面=寬度/ 2 *高度/ 2 = = 37500

V平面=寬度/ 2 *高度/ 2 = = 37500

       ======== 
           225000          
           ======== 

誰能解釋我,如果我需要得到每個組件的步幅值,我怎麼能拿到

有什麼辦法可以得到它嗎?

回答

3

我可以告訴你如何可以從這個獲得INT RGB []:

public int[] decodeYUV420SP(byte[] yuv420sp, int width, int height) { 

     final int frameSize = width * height; 

     int rgb[] = new int[width * height]; 
     for (int j = 0, yp = 0; j < height; j++) { 
      int uvp = frameSize + (j >> 1) * width, u = 0, v = 0; 
      for (int i = 0; i < width; i++, yp++) { 
       int y = (0xff & ((int) yuv420sp[yp])) - 16; 
       if (y < 0) 
        y = 0; 
       if ((i & 1) == 0) { 
        v = (0xff & yuv420sp[uvp++]) - 128; 
        u = (0xff & yuv420sp[uvp++]) - 128; 
       } 

       int y1192 = 1192 * y; 
       int r = (y1192 + 1634 * v); 
       int g = (y1192 - 833 * v - 400 * u); 
       int b = (y1192 + 2066 * u); 

       if (r < 0) 
        r = 0; 
       else if (r > 262143) 
        r = 262143; 
       if (g < 0) 
        g = 0; 
       else if (g > 262143) 
        g = 262143; 
       if (b < 0) 
        b = 0; 
       else if (b > 262143) 
        b = 262143; 

       rgb[yp] = 0xff000000 | ((r << 6) & 0xff0000) 
         | ((g >> 2) & 0xff00) | ((b >> 10) & 0xff); 

      } 
     } 
     return rgb; 
    } 
+0

謝謝,但我們不希望它是轉換爲RGB,我們想在事實上壓縮到通一個只將數據轉換成YUV格式的解碼器,只有這個東西是,我們不知道如何調整步長值。 – Amitg2k12 2011-12-19 15:43:21

0

我認爲這是簡單的。 從android中chekout YUVImage類。您可以從來自相機預覽的byte []數據構造YUV圖像。 你可以這樣寫:

//width and height you get it from camera properties, image width and height of camera preview 
YuvImage image=new YuvImage(data, ImageFormat.NV21, int width, int height, null); 
byte[] newData = image.getYuvData(); 
//or if you want int format = image.getYuvFormat(); 
0

這是一個很古老的問題,但我已經對同樣的問題掙扎了幾天。所以我決定寫一些評論來幫助別人。在Android開發者網站(here)中描述的YV12似乎不是YV12的一種,而是IMC1。該頁面表示,y-stride和uv-stride都應該以16字節對齊。

而且也是本page說:

對於YV12,所接收的圖像緩衝器不必緊緊 打包,因爲可能在像素數據的每一行, 爲一體的端部是填充描述在YV12中。

基於上述意見,我使用python命令行來計算它:

>>> w = 500 
>>> h = 300 
>>> y_stride = (500 + 15)/16 * 16.0 
>>> y_stride 
512.0 
>>> y_size = y_stride * h 
>>> y_size 
153600.0 
>>> uv_stride = (500/2 + 15)/16 * 16.0 
>>> uv_stride 
256.0 
>>> u_size = uv_stride * h/2 
>>> v_size = uv_stride * h/2 
>>> size = y_size + u_size + v_size 
>>> size 
230400.0