Я начал проект с Grafika и изменил его. У меня есть фреймворк (не слишком отличный от оригинала), который захватывает предварительный просмотр с Camera
и непрерывно кодирует его на видео одновременно с разными разрешениями.MediaCodec Кодированное видео имеет зеленую полосу внизу, а цветность завинчена
MediaCodec
(для кодирования) сконфигурирован для использования COLOR_FormatSurface
, чтобы мы могли визуализировать поверхность, запрошенную с использованием getInputSurface()
, используя GLES.
Формат носителя установлен MIME тип video/avc
Для большинства телефонов, эта установка работает отлично.
Но для нескольких телефонов закодированное видео имеет слегка искаженные значения цветности и зеленую полосу внизу.
В настоящее время поверхность энкодера имеет разрешение 640x360. EGLConfig, выбранный для рендеринга на поверхность, поддерживает 32-битный формат RGBA.
Предварительный просмотр во всех телефонах.
Так что я предполагаю, что с параметрами кодировщика есть что-то не так, как со стороны приложения, так и со стороны ОС.
Это происходит на Android 4.4. - Не уверен, если он воспроизводится на 5. *.
] 2
Это конечно выглядит как проблема формата цвета, который не должен быть происходит при кодировании с поверхности. Можете ли вы попробовать другие разрешения? Мне любопытно, есть ли у кодека на этих устройствах ошибка в этом разрешении. Вы знаете, есть ли у всех затронутых устройств один и тот же чип видеокодера? (Обычно вы можете сказать, посмотрев на logcat - обычно есть зависание, связанное с конкретным оборудованием). – fadden
Обычно разрешение предварительного просмотра и разрешение кодирования различны. Разрешено ли разрешение «640x360»? Вы кодируете '1080p'? Если это так, то я думаю, что ваша проблема связана с выравниванием по вертикали. Кодер может читать __1088__ вместо __1080__. Если это так, выход камеры должен быть выровнен аналогично. – Ganesh
Предварительный просмотр 720p. Это не имеет значения. Потому что я представляю его как текстуру (используя OpenGLES) на поверхность энкодера. @fadden уже указал на эту проблему. Похоже на проблему с кодеком. Теперь я использую Surface с высотой как следующий кратный 16. –