Получение кадров из видео изображения в Android | VPROS.ru

Получение кадров из видео изображения в Android

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

Я попытался с помощью метода onPreviewFrame с которой вы получаете текущий кадр в виде байтового массива и пытался расшифровать его с класса BitmapFactory но он возвращает NULL. Формат рамки заголовков ЮВ, которые могут быть переведены в bitmap, но это занимает слишком много времени на телефоне. Также я читал, что метод onPreviewFrame имеет ограничение на время выполнения, если это занимает слишком много времени, приложение может аварийно завершить работу.

Так что это правильный способ сделать это?

One Reply to “Получение кадров из видео изображения в Android”

  1. Я пробовал код, приведенный в предыдущем ответе нашли что Colorvalues не являются точными. Я проверил его, принимая предварительный просмотр и камеры.takePicture которая непосредственно возвращает массив в формате JPEG. И цвета были очень разные. После немного больше поиска я нашел еще один пример для преобразования PreviewImage из YCrCb в RGB:

    static public void decodeYUV420SP(int[] rgb, byte[] yuv420sp, int width, int height) {     final int frameSize = 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);         }     } } 

    Цветовые значения, приведенные в этом и takePicture() совпадают. Я думал, что я должен разместить его здесь. Это где я получил этот код от. Надеюсь, что это помогает.

Comments are closed.