2015-09-18 2 views
2

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

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

Формат носителя установлен MIME тип video/avc

Для большинства телефонов, эта установка работает отлично.

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

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

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

Так что я предполагаю, что с параметрами кодировщика есть что-то не так, как со стороны приложения, так и со стороны ОС.

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

![Green bar image] 2

+1

Это конечно выглядит как проблема формата цвета, который не должен быть происходит при кодировании с поверхности. Можете ли вы попробовать другие разрешения? Мне любопытно, есть ли у кодека на этих устройствах ошибка в этом разрешении. Вы знаете, есть ли у всех затронутых устройств один и тот же чип видеокодера? (Обычно вы можете сказать, посмотрев на logcat - обычно есть зависание, связанное с конкретным оборудованием). – fadden

+1

Обычно разрешение предварительного просмотра и разрешение кодирования различны. Разрешено ли разрешение «640x360»? Вы кодируете '1080p'? Если это так, то я думаю, что ваша проблема связана с выравниванием по вертикали. Кодер может читать __1088__ вместо __1080__. Если это так, выход камеры должен быть выровнен аналогично. – Ganesh

+0

Предварительный просмотр 720p. Это не имеет значения. Потому что я представляю его как текстуру (используя OpenGLES) на поверхность энкодера. @fadden уже указал на эту проблему. Похоже на проблему с кодеком. Теперь я использую Surface с высотой как следующий кратный 16. –

ответ

2

Я отвечу, что для себя только в случае, если кто-то будет полезно.

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

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

В случае, если вы не имеете зависимость от каких-либо третьих сторон, API/игроков и т.д.

Смежные вопросы