У меня есть приложение, которое генерирует кучу jpg, которые мне нужно превратить в веб-видео. Я пытаюсь получить данные rgb из jpeg в образец vpxenc. Я вижу основные формы из исходных jpg в выходном видео, но все окрашено в зеленый цвет (даже пиксели, которые должны быть черными, наполовину зеленые), и в каждой второй строке сканирования есть какой-то мусор.
Я пытаюсь передать ему данные VPX_IMG_FMT_YV12, которые, как я предполагаю, имеют следующую структуру:
для каждого кадра 8-битные данные Y 8-битные средние значения каждого блока 2x2 V 8-битные средние значения каждого блока 2x2 U
Вот исходное изображение и скриншот видео, которое выходит:
Вполне возможно, что я неправильно выполняю преобразование RGB->YV12, но даже если я закодирую только 8-битные данные Y и установлю для блоков U и V значение 0, видео будет выглядеть примерно так же. Я в основном запускаю свои данные RGB через это уравнение:
// (R, G, and B are 0-255)
float y = 0.299f*R + 0.587f*G + 0.114f*B;
float v = (R-y)*0.713f;
float u = (B-v)*0.565f;
.. а затем, чтобы создать отфильтрованные значения 2x2 для U и V, которые я записываю в vpxenc, я просто выполняю (a + b + c + d) / 4, где a,b,c,d — значения U или V каждый блок размером 2x2 пикселя.
Поэтому мне интересно:
Есть ли более простой способ (в коде) взять данные RGB и передать их в vpx_codec_encode, чтобы получить хорошее веб-видео?
Мое преобразование RGB-> YV12 где-то неправильно?
Любая помощь будет принята с благодарностью.