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

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

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

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

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

2 ответов


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

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

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

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

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

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


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

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

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

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

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


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