Видео, закодированное MediaCodec, имеет зеленую полосу внизу и искаженную цветность

Я начал проект с Grafika и изменил его. У меня есть фреймворк (не слишком отличающийся от оригинала), который захватывает предварительный просмотр из Camera и непрерывно кодирует его в видео одновременно с разными разрешениями.

MediaCodec (для кодирования) настроен на использование COLOR_FormatSurface, чтобы мы могли выполнять рендеринг на поверхность, запрошенную с помощью getInputSurface(), используя GLES.

В качестве формата мультимедиа задан тип MIME video/avc.

Для большинства телефонов эта настройка работает идеально.

Но для некоторых телефонов закодированное видео имеет слегка искаженные значения цветности и зеленую полосу внизу.

В настоящее время поверхность кодировщика имеет разрешение 640x360. EGLConfig, выбранный для рендеринга на поверхность, поддерживает 32-битный формат RGBA.

Предварительный просмотр идеален на всех телефонах.

Поэтому я предполагаю, что что-то не так с параметрами кодировщика либо на стороне приложения, либо на стороне ОС.

Это происходит на Android 4.4. - Не уверен, воспроизводятся ли на 5.*.

![Изображение зеленой полосы]2


person Sahil Bajaj    schedule 18.09.2015    source источник
comment
Это выглядит как проблема с цветовым форматом, чего не должно происходить при кодировании с поверхности. Вы можете попробовать другие разрешения? Мне любопытно, есть ли ошибка в кодеке на этих устройствах при таком разрешении. Знаете ли вы, все ли затронутые устройства имеют один и тот же чип видеокодера? (Обычно это можно понять, взглянув на logcat — обычно там какой-то бормотание, связанное с аппаратным обеспечением.)   -  person fadden    schedule 18.09.2015
comment
Обычно разрешение предварительного просмотра и разрешение кодирования различаются. Является ли 640x360 также разрешением кодировки? Вы кодируете 1080p? Если да, то я думаю, что ваша проблема связана с выравниванием по вертикали. Кодер может считывать 1088 вместо 1080. Если это так, выход камеры должен быть выровнен аналогичным образом.   -  person Ganesh    schedule 20.09.2015
comment
Превью 720р. Это не имеет значения. Потому что я визуализирую его как текстуру (используя OpenGLES) на поверхность кодировщика. @fadden уже указал на проблему. Похоже проблема с кодеком. Теперь я использую поверхность с высотой, кратной 16.   -  person Sahil Bajaj    schedule 21.09.2015
comment
@Ganesh: Извините, кажется, я неправильно объяснил вопрос. Предварительный просмотр камеры: 720p, Разрешение предварительного просмотра устройства: Разрешение устройства, Разрешение кодировщика: 360p, Дело в том, что API прямой трансляции YouTube поддерживает только следующие разрешения: Разрешения, поддерживаемые прямой трансляцией Должен ли я просто использовать высоту 368 вместо 360? Проблема в том, что соотношение сторон испорчено, и YouTube добавит немного гашения с обеих сторон.   -  person Sahil Bajaj    schedule 21.09.2015
comment
Вы смогли решить эту проблему?   -  person Vinayak Garg    schedule 22.01.2016
comment
Я добавил ответ из-за ограничения слов в комментариях. Проверьте это   -  person Sahil Bajaj    schedule 22.01.2016
comment
@fadden: Знаете ли вы о каком-либо исправлении/обходном пути для этого. Я хочу кодировать в 1080, но у меня возникает такая же проблема на устройстве с чипсетом MediaTek. Я пробовал кодировать в 1072, и это нормально. Но я не хочу использовать это решение по нескольким причинам: 1) нестандартное разрешение, 2) как решить, какое устройство кодирует в 1080, а какое из них требует 1072, 3) могут возникнуть другие проблемы (экспорт в 1088 исправил эту проблему, но добавил другие проблемы) Заранее большое спасибо!   -  person Vinayak Garg    schedule 29.01.2016
comment
Вы не единственный, у кого есть проблемы с MediaTek (например, stackoverflow.com/questions/34891420). Вы проверили MediaCodecInfo.CodecProfileLevel, чтобы убедиться, что устройство поддерживает 1080p? Многие устройства имеют секретное требование кратности 16, но все равно корректно обрабатывают 1080.   -  person fadden    schedule 29.01.2016


Ответы (1)


Я отвечу на это для себя на всякий случай, если кому-то еще это покажется полезным.

По-видимому, проблема возникает только на некоторых избранных чипсетах, таких как MediaTek, которые не поддерживают разрешения, не кратные 16. В моем случае это было 640x360 (где высота кратна 8). Чтобы частично решить эту проблему, я добавил проверку в коде приложения, если кодировщик Omx.mtk, то перенастройте кодировщик с шириной/высотой как next multiple of 16, что в моем случае получается 640x368. (наиболее близкое к требованию, т.е. 360p).

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

Если у вас нет зависимости от каких-либо сторонних API/плееров и т. д.

person Sahil Bajaj    schedule 22.01.2016