Я пытаюсь закодировать видео .h264 с помощью MediaCodec и Camera (onPreviewFrame). Я застрял при преобразовании цветового пространства из YV12 (с камеры) в COLOR_FormatYUV420SemiPlanar (нужен кодеру).
Изменить: я заметил, что это может быть ошибка в MediaCodec, поскольку следующий код работает на других устройствах:
public static byte[] YV12toYUV420PackedSemiPlanar(final byte[] input, final byte[] output, final int width, final int height) {
/*
* COLOR_TI_FormatYUV420PackedSemiPlanar is NV12
* We convert by putting the corresponding U and V bytes together (interleaved).
*/
final int frameSize = width * height;
final int qFrameSize = frameSize / 4;
System.arraycopy(input, 0, output, 0, frameSize); // Y
for (int i = 0; i < qFrameSize; i++) {
output[frameSize + i * 2] = input[frameSize + i + qFrameSize]; // Cb (U)
output[frameSize + i * 2 + 1] = input[frameSize + i]; // Cr (V)
}
return output;
}
Вот результат, который я получаю (кажется, что биты цвета имеют некоторое смещение):
Редактирование 2. Размер кадра – 1280 x 720, устройство – Samsung s5 (SM-G900V) с OMX.qcom.video.encoder.avc под управлением Android Lollipop 5.0 (API 21).
Примечание. Я знаю о COLOR_FormatSurface, но мне нужно, чтобы это работало на API 16.