Видео в Android: изменение визуальных свойств (например, насыщенность, яркость)


Предполагая, что у нас есть Surface в Android, который отображает видео (например, h264) с медиаплеером:

1) Можно ли изменить отображаемую насыщенность, контрастность и яркость отображаемого на поверхности видео? В реальном времени? Например, изображения могут использовать setColorFilter Есть ли что-нибудь подобное в Android для обработки видеокадров?

Альтернативный вопрос (если № 1 слишком сложен):

2) если мы хотим экспортировать это видео, например, с повышенной насыщенностью, мы должны использовать Кодек, например MediaCodec. Какая технология (метод, класс, библиотека и т.д...) мы должны использовать до кодека/выполнить действие "сохранить", чтобы применить изменения насыщенности?

2 6

2 ответа:

Для отображения только один простой подход заключается в использовании GLSurfaceView, а SurfaceTexture для рендеринга видеокадров, а также MediaPlayer. Ответ прокаша ссылается на библиотеку с открытым исходным кодом, которая показывает, как это сделать. Если вы будете искать эти термины вместе,вы найдете множество других примеров. Следуя этому пути, вы рисуете видеокадры в текстуру OpenGL и создаете шейдеры OpenGL, чтобы управлять тем, как текстура визуализируется. (Я бы предложил спросить Прокаша о дальнейших деталях и примите его ответ, если этого достаточно, чтобы удовлетворить ваши требования.)

Аналогично, вы можете использовать инструменты OpenGL с MediaCodec и еще MediaExtractor для декодирования видеокадров. MediaCodec будет сконфигурирован для вывода в SurfaceTexture, так что вам не нужно будет делать намного больше, чем кодировать некоторую шаблонную таблицу, чтобы получить выходные буферы. Процесс фильтрации будет таким же, как и с MediaPlayer. Существует ряд примеров использования MediaCodec в качестве дешифратора, например здесь и здесь . Достаточно просто заменить TextureView или SurfaceView, используемые в этих примерах, на GLSurfaceView из примера Прокаша.

Преимущество этого подхода заключается в том, что у вас есть доступ ко всем отдельным дорожкам в медиафайле. Из-за этого вы должны иметь возможность фильтровать видеодорожку с помощью OpenGL и прямо копировать другие треки для экспорта. Вы бы использовали MediaCodec в режиме кодирования с Surface из GLSurfaceView в качестве входных данных и a MediaMuxer чтобы положить все это вернуться вместе. Вы можете увидеть несколько соответствующих примеров в BigFlake.

Вы можете использовать MediaCodec Без Surface для прямого доступа к декодированным байтовым данным и манипулирования ими таким образом. этот пример иллюстрирует этот подход. Вы можете манипулировать данными и отправлять их в кодер для экспорта или рендеринга по своему усмотрению. Существует некоторая дополнительная сложность в работе с необработанными байтовыми данными. Обратите внимание, что мне нравится этот пример, потому что он иллюстрирует работу с аудио и видео дорожками отдельно.

Вы также можете использовать FFMpeg, либо в собственном коде, либо через одну из оболочек Java. Эта опция больше ориентирована на экспорт, чем на немедленное воспроизведение. Смотрите здесь или здесь для некоторых библиотек, которые пытаются сделать FFMpeg доступным для Java. Они в основном являются оболочками вокруг интерфейса командной строки. Вам потребуется проделать дополнительную работу, чтобы управлять воспроизведением через FFMpeg, но это определенно выполнимо.

Если у вас есть вопросы, не стесняйтесь спрашивать, и я постараюсь объяснить, какой вариант имеет наибольший смысл для вашего случая использования.

Если вы используете плеер, который поддерживает видео фильтры, то вы можете сделать это.

Примером такого плеера является VLC , который построен вокруг FFMPEG [1].

VLC довольно легко компилируется для Android. Тогда все, что вам нужно, это libvlc (файл aar), и вы можете создать свое собственное приложение. Смотрите инструкции по компиляции здесь .

Вам также потребуется написать свой собственный модуль. Просто продублируйте существующий и измените его. Излишне говорить, что VLC предлагает сильные возможности транскодирования и потоковой передачи.

Как мощный VLC для Android, он имеет один огромный недостаток-видео фильтры не могут работать с аппаратным декодированием (только для Android). Это означает, что вся обработка видео происходит на процессоре.


Другие варианты-использовать GLSL / OpenGL над такими поверхностями, как GLSurfaceView и TextureView. Это гарантия мощности GPU.