2011-12-19 8 views
0

В нашем приложении, мы должны передавать видео, мы используем класс камеры для захвата буфера и отправить по назначению,Android YUV Формат изображения

Я установил формат YV12 в качестве параметра камеры, чтобы получить буфер,

для 500x300 буфера, мы получаем буфер 230400 байт,

я хочу знать, это ожидается, размер буфера?
Я считаю, что размер должен быть

Y Плоскость = ширина * высота = 500x300 = 150000

U Плоскость = ширина/2 * высота/2 = = 37500

В Плоскость = ширина/2 * высота/2 = = 37500

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

может кто-нибудь объяснить мне, если мне нужно, чтобы получить Stride значения каждого компонента, как я могу получить, что

Есть ли способ получить это?

ответ

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

0

Я думаю, что это просто. chekout YUVImage класс от android. Вы можете создать YUV Image from byte [] данные, поступающие из предварительного просмотра камеры. Вы можете написать так:

//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

Это довольно старый вопрос, но я боролся с той же проблемой в течение нескольких дней. Поэтому я решил написать несколько комментариев, чтобы помочь другим. YV12, описанный на сайте разработчика Android (here), кажется, не является видом YV12, но IMC1. На странице написано, что и у-шаг, и у-шаг должны быть выровнены в 16 байт.

А также это page говорит, что:

Для YV12, буфер изображения, который получен не обязательно плотно упакованы, так как может быть обивка в конце каждой строки данных пикселей, , как описанной в YV12.

На основании приведенных выше замечаний, я вычислил ее с помощью командной строки: питон

>>> 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 

 Смежные вопросы

  • Нет связанных вопросов^_^