Видео в Android: изменение визуальных свойств (например, насыщенность, яркость)
Предполагая, что у нас есть Surface
в Android, который отображает видео (например, h264) с медиаплеером:
1) Можно ли изменить отображаемую насыщенность, контрастность и яркость отображаемого на поверхности видео? В реальном времени? Например, изображения могут использовать setColorFilter
Есть ли что-нибудь подобное в Android для обработки видеокадров?
Альтернативный вопрос (если № 1 слишком сложен):
2) если мы хотим экспортировать это видео, например, с повышенной насыщенностью, мы должны использовать Кодек, например MediaCodec
. Какая технология (метод, класс, библиотека и т.д...) мы должны использовать до кодека/выполнить действие "сохранить", чтобы применить изменения насыщенности?
2 ответа:
Для отображения только один простой подход заключается в использовании
GLSurfaceView
, аSurfaceTexture
для рендеринга видеокадров, а такжеMediaPlayer
. Ответ прокаша ссылается на библиотеку с открытым исходным кодом, которая показывает, как это сделать. Если вы будете искать эти термины вместе,вы найдете множество других примеров. Следуя этому пути, вы рисуете видеокадры в текстуру OpenGL и создаете шейдеры OpenGL, чтобы управлять тем, как текстура визуализируется. (Я бы предложил спросить Прокаша о дальнейших деталях и примите его ответ, если этого достаточно, чтобы удовлетворить ваши требования.)Аналогично, вы можете использовать инструменты OpenGL с
MediaCodec
и ещеMediaExtractor
для декодирования видеокадров.MediaCodec
будет сконфигурирован для вывода вSurfaceTexture
, так что вам не нужно будет делать намного больше, чем кодировать некоторую шаблонную таблицу, чтобы получить выходные буферы. Процесс фильтрации будет таким же, как и сMediaPlayer
. Существует ряд примеров использованияMediaCodec
в качестве дешифратора, например здесь и здесь . Достаточно просто заменитьTextureView
илиSurfaceView
, используемые в этих примерах, наGLSurfaceView
из примера Прокаша.Преимущество этого подхода заключается в том, что у вас есть доступ ко всем отдельным дорожкам в медиафайле. Из-за этого вы должны иметь возможность фильтровать видеодорожку с помощью OpenGL и прямо копировать другие треки для экспорта. Вы бы использовали
MediaCodec
в режиме кодирования сSurface
изGLSurfaceView
в качестве входных данных и aMediaMuxer
чтобы положить все это вернуться вместе. Вы можете увидеть несколько соответствующих примеров в BigFlake.Вы можете использовать
MediaCodec
БезSurface
для прямого доступа к декодированным байтовым данным и манипулирования ими таким образом. этот пример иллюстрирует этот подход. Вы можете манипулировать данными и отправлять их в кодер для экспорта или рендеринга по своему усмотрению. Существует некоторая дополнительная сложность в работе с необработанными байтовыми данными. Обратите внимание, что мне нравится этот пример, потому что он иллюстрирует работу с аудио и видео дорожками отдельно.Вы также можете использовать FFMpeg, либо в собственном коде, либо через одну из оболочек Java. Эта опция больше ориентирована на экспорт, чем на немедленное воспроизведение. Смотрите здесь или здесь для некоторых библиотек, которые пытаются сделать FFMpeg доступным для Java. Они в основном являются оболочками вокруг интерфейса командной строки. Вам потребуется проделать дополнительную работу, чтобы управлять воспроизведением через FFMpeg, но это определенно выполнимо.
Если у вас есть вопросы, не стесняйтесь спрашивать, и я постараюсь объяснить, какой вариант имеет наибольший смысл для вашего случая использования.
Если вы используете плеер, который поддерживает видео фильтры, то вы можете сделать это.
Примером такого плеера является VLC , который построен вокруг FFMPEG [1].
VLC довольно легко компилируется для Android. Тогда все, что вам нужно, это libvlc (файл aar), и вы можете создать свое собственное приложение. Смотрите инструкции по компиляции здесь .
Вам также потребуется написать свой собственный модуль. Просто продублируйте существующий и измените его. Излишне говорить, что VLC предлагает сильные возможности транскодирования и потоковой передачи.
Как мощный VLC для Android, он имеет один огромный недостаток-видео фильтры не могут работать с аппаратным декодированием (только для Android). Это означает, что вся обработка видео происходит на процессоре.
Другие варианты-использовать GLSL / OpenGL над такими поверхностями, как GLSurfaceView и TextureView. Это гарантия мощности GPU.