MediaCodec разные цвета на Genymotion и Huddle 2Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 MediaCodec разные цвета на Genymotion и Huddle 2

Сообщение Anonymous »

Моя цель:

Использовать фильтры (обрезка, Черно-белое изображение, Обнаружение краев) к видео MP4 с SD-карты с помощью сценария рендеринга.
Попытки решения

-Использовать MediaCodec для прямого вывода на поверхность.

Визуализированные цвета были правильными, но я не смог найти способ обрабатывать каждый кадр за раз и применять фильтры. с помощью renderscript.
-Скопируйте декодированный буфер из сценария рендеринга и преобразуйте его в RGB с помощью ScriptIntrinsicYuvToRGB.

Я не могу использовать ScriptIntrinsicYuvToRGB, поскольку он предполагает, что входящие данные YUV отформатированы иначе, чем входящие данные. (Как правильно преобразовать цвета YUV в RGB в Android?)
-Скопируйте декодированный буфер из сценария рендеринга и преобразуйте в RGB с помощью специального кода.

Мое текущее решение преобразует YUV в RGB с использованием кода, очень похожего на https://stackoverflow.com/a/12702836/601147 (спасибо @Derzu)

Код: Выделить всё

            /**
* Converts YUV420 NV21 to RGB8888
*
* @param data byte array on YUV420 NV21 format.
* @param width pixels width
* @param height pixels height
* @return a RGB8888 pixels int array. Where each int is a pixels ARGB.
*/
public int[] convertYUV420_NV21toRGB8888(byte [] data, int width, int height) {
int size = width*height;
int offset = size;
int[] pixels = new int[size];
int u, v, y1, y2, y3, y4;

// i percorre os Y and the final pixels
// k percorre os pixles U e V
for(int i=0, k=0; i < size; i+=2, k+=2) {
y1 = data[i]&0xff;
y2 = data[i+1]&0xff;
y3 = data[width+i  ]&0xff;
y4 = data[width+i+1]&0xff;

u = data[offset+k  ]&0xff;
v = data[offset+k+1]&0xff;
u = u-128;
v = v-128;

//                pixels[i] = convertYUVtoRGB(y1, v,u);
//                pixels[i+1] = convertYUVtoRGB(y2, v,u);
//                pixels[width+i  ] = convertYUVtoRGB(y3, v,u);
//                pixels[width+i+1] = convertYUVtoRGB(y4, v,u);

pixels[i] = convertYUVtoRGB(y1, u, v);
pixels[i+1] = convertYUVtoRGB(y2,  u, v);
pixels[width+i  ] = convertYUVtoRGB(y3,  u, v);
pixels[width+i+1] = convertYUVtoRGB(y4, u, v);

if (i!=0 && (i+2)%width==0)
i+=width;
}

return pixels;
}

private int convertYUVtoRGB(int y, int u, int v) {
int r,g,b;

r = y + (int)1.402f*v;
g = y - (int)(0.344f*u +0.714f*v);
b = y + (int)1.772f*u;
r = r>255? 255 : r255? 255 : g255? 255 : b

Подробнее здесь: [url]https://stackoverflow.com/questions/30148988/mediacodec-different-colours-on-genymotion-and-huddle-2[/url]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»