2013-04-01 2 views
0

Может ли кто-нибудь предоставить мне образец кода или пример для чтения каждого кадра видео камеры с использованием интерфейса PreviewCallback?PreviewCallback для видео камеры

Я хочу получить рамку без использования поверхности, так как сначала хочу, чтобы кадр видеокамеры не отображался на экране, а затем я могу передать этот кадр на CCLayer cocos2dx.

ответ

1

Это медленный процесс и не может обрабатывать каждый кадр данных, передаваемых в обратный вызов предварительного просмотра. Его следует использовать только в том случае, если ваши требования к программе предварительного просмотра в реальном времени делают невозможным отображение видео с камеры или видео с камеры с помощью наложения наложения stencil, и ваш дисплей может выдерживать только несколько кадров в секунду с некоторой задержкой.

Некоторые важные шаги:

  1. Ваша активность должна простираться Поверхностный держатель, и вы не должны начать камеру, пока поверхность не будет создана.
  2. Предварительный просмотр поддерживает только определенный размер на каждом устройстве (480 x 320 на последнем устройстве, которое я проверил - некоторое время назад), но ваш запрос не вызовет никаких проблем, он просто проигнорируется. Когда вы наконец получите обратный вызов предварительного просмотра, проверьте фактический размер кадра в onPreviewFrame().
  3. Данные массива byte[], отправленные на номер onPreviewFrame(), находятся в формате YCbCr_422_SP . Других форматов нет, даже если вы попытаетесь установить их . Данные описаны здесь: http://groups.google.com/group/android-developers/msg/d3b29d3ddc8abf9b
  4. Не пытайтесь декодировать данные в onPreviewFrame(). Недостаточно времени - вы будете шлепать камеру, если попытаетесь задержать систему в , которая работает так долго. Скопируйте данные в собственный буфер, а декодируйте в отдельном Thread.
  5. Вам необходимо будет пропустить обработку полученных новых кадров, пока ваш Thread обрабатывает любой конкретный кадр. Подождите, пока закончится Thread до , используя данные из следующего доступного кадра.

Расшифруйте YUV Просмотр данных:

// decode Y, U, and V values on the YUV 420 buffer 
// described as YCbCr_422_SP by Android - David Manpearl 
public static void decodeYUV(int[] out, byte[] fg, int width, int 
height) throws NullPointerException, IllegalArgumentException { 
     final int sz = width * height; 
     if(out == null) throw new NullPointerException("buffer 'out' is null"); 
     if(out.length < sz) throw new IllegalArgumentException("buffer 'out' size " + out.length + " < minimum " + sz); 
     if(fg == null) throw new NullPointerException("buffer 'fg' is null"); 
     if(fg.length < sz) throw new IllegalArgumentException("buffer 'fg' size " + fg.length + " < minimum " + sz * 3/ 2); 
     int i, j; 
     int Y, Cr = 0, Cb = 0; 
     for(j = 0; j < height; j++) { 
       int pixPtr = j * width; 
       final int jDiv2 = j >> 1; 
       for(i = 0; i < width; i++) { 
         Y = fg[pixPtr]; if(Y < 0) Y += 255; 
         if((i & 0x1) != 1) { 
           final int cOff = sz + jDiv2 * width + (i >> 1) * 2; 
           Cb = fg[cOff]; 
           if(Cb < 0) Cb += 127; else Cb -= 128; 
           Cr = fg[cOff + 1]; 
           if(Cr < 0) Cr += 127; else Cr -= 128; 
         } 
         int R = Y + Cr + (Cr >> 2) + (Cr >> 3) + (Cr >> 5); 
         if(R < 0) R = 0; else if(R > 255) R = 255; 
         int G = Y - (Cb >> 2) + (Cb >> 4) + (Cb >> 5) - (Cr >> 1) + (Cr >> 3) + (Cr >> 4) + (Cr >> 5); 
         if(G < 0) G = 0; else if(G > 255) G = 255; 
         int B = Y + Cb + (Cb >> 1) + (Cb >> 2) + (Cb >> 6); 
         if(B < 0) B = 0; else if(B > 255) B = 255; 
         out[pixPtr++] = 0xff000000 + (B << 16) + (G << 8) + R; 
       } 
     } 
} 

Преобразование byte[] массива в Bitmap:

Bitmap bitmap = BitmapFactory.decodeByteArray(out , 0, out.length); 
+0

Большое спасибо за Ваш ответ. –

+0

Могу ли я получить кадры без использования поверхности. На самом деле, я хочу сначала создать кадр, не отображая ничего на поверхности, чтобы я мог отправить кадр на CCLayer, чтобы отобразить его. –

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