2016-08-01 5 views
3

Я начинаю декодировать/кодировать видео для приложения, и кажется, что BigFlake's site является авторитетной ссылкой на рабочий видеокод. Я скопировал ExtractMpegFramesTest_egl14.java в свой проект и изменил его, чтобы использовать разные пути к файлу, но ничего больше. Он извлекает правильные кадры из предварительно записанных видео, которые я копирую в устройство. Однако, при попытке использовать его с видео, записанным с помощью камеры устройства, я получаю кадры, которые только горизонтальные линии:Почему ExtractMpegFramesTest не работает с вращающимися входными файлами?

enter image description here

После тестирования различных записанных видео, я понял, проблема возникает из повернутых видео. Камера устройства кодирует кадры, когда они поступают из фреймбуфера, а затем помечает метку вращения на видео. Это может быть извлечена из MediaFormat объекта:

int rotation = format.getInteger("rotation-degrees"); 

К сожалению, обменивая ширина/высота сохраненного изображения ничего не изменить, чтобы все изображения будут испорчены. Что нужно сделать для кода сохранения для правильной обработки повернутых кадров?

ответ

3

Как подсказ. source code comment pointed out by another answer, для OpenGL требуется преобразование изображения. Исходный invert boolean помогает с источниками, которые не были повернуты или имеют поворот на 180 градусов. Но другие ориентации (90 и 270) будут отображать перевернутое изображение, поэтому их тоже нужно перевернуть.

Вот изменения, которые я сделал правильно обрабатывать вращение:

  1. Прочитайте атрибут rotation-degrees (при наличии) с исходного носителя.
  2. Измените конструктор CodecOutputSurface, чтобы принять числовой параметр вращения, который хранится в переменной экземпляра mRotation.
  3. Изменить исходный invert код, который будет использоваться, когда вращение 0 или 180.
  4. Используйте другую матрицу преобразования, когда вращение 90 или 270.

Вы можете получить полную модифицированную версию от the following gist а также взгляните на individual changes, упомянутый выше.