Подтвердить что ты не робот

Добавление растрового изображения водяного знака над видео в android: 4.3 MediaMuxer или ffmpeg

Вот мой сценарий:

  • Загрузите avi-фильм из Интернета.
  • Открыть растровый ресурс
  • Наложение этого растрового изображения в нижней части фильма на все кадры в фоновом режиме
  • Сохранение видео в хранилище extarnal
  • Продолжительность видео составляет 15 секунд.

Можно ли это использовать MediaMuxer? Любая информация по этому поводу с радостью получена

Я искал http://bigflake.com/mediacodec/#DecodeEditEncodeTest (спасибо @fadden), и там говорится:

"Декодирование кадра и его копирование в ByteBuffer с glReadPixels() занимает около 8 мс на Nexus 5, достаточно быстро, чтобы идти в ногу с 30fps вход, но дополнительные шаги, необходимые для сохранения он на диск, поскольку PNG дороги (примерно полсекунды)"

Так что почти 1 сек/фрейм неприемлемо. Из того, что я думаю, один из способов заключается в том, чтобы сохранить каждый фрейм как PNG, открыть его, добавить на него наложение растрового изображения и затем сохранить его. Однако для этого потребуется огромное количество времени.

Интересно, есть ли способ сделать что-то вроде этого:

  • Открыть видеофайл с внешнего хранилища
  • Запустить его декодирование
  • Каждый декодированный кадр будет изменен с наложением растрового изображения в памяти
  • Кадр отправляется кодеру.

В iOS я увидел, что есть способ взять исходное аудио + оригинальное видео + изображение и добавить его в контейнер, а затем просто закодировать все это...

Должен ли я переключиться на ffmpeg? Насколько стабильным и совместимым является ffmpeg? Я рискую проблемы совместимости с устройствами Android 4.0+? Есть ли способ использовать ffmpeg для этого? Я новичок в этом домене и все еще занимаюсь исследованиями.


Через годы редактирование:
Годы прошли с тех пор, как вопрос и ffmpeg на самом деле нелегко добавить в коммерческое программное обеспечение с точки зрения лицензии. Как это произошло? Более новые версии android более способны на это со стандартным sdk?

4b9b3361

Ответ 1

Я не очень много знаю о MediaMuxer, но ffmpeg поддерживает наложенную функциональность. FFMPEG имеет различные фильтры, один из которых - фильтр наложения. Насколько я понимаю, вы хотите наложить изображение (например, png) на видео, ffmpeg, безусловно, является полезной основой для выполнения этой задачи. Вы можете установить формат вывода, который вы можете установить координаты изображения, которое должно быть переигрено.

например.

ffmpeg -i input.avi -i logo.png -filter_complex 'overlay=10:main_h-overlay_h-10' output.avi

Выше команда добавляет overlays logo.png в файл входного файла.вви в нижнем левом углу.

Дополнительная информация о фильтрах доступна на следующем веб-сайте,

https://www.ffmpeg.org/ffmpeg-filters.html#overlay-1

Если это решение вашей проблемы, вам нужен код C, эквивалентный приведенной выше команде. Вам также нужно увидеть производительность ffmpeg, потому что это чистая программная среда.

Надеюсь, я правильно понял ваш вопрос, и это помогает.

Ответ 2

Вы можете попробовать INDE Media Pack - https://software.intel.com/en-us/articles/intel-inde-media-pack-for-android-tutorials

Он имеет функцию перекодирования\ремуксирования как класс MediaComposer и несколько примеров таких эффектов, как JpegSubstituteEffect, - показывает, как заменить рамку видео на изображение из файла jpg и TextOverlayEffect, чтобы наложить текст на видеокадр и т.д. Его можно было бы легко увеличить до эффекта водяного знака

enter image description here

Ответ 3

Если вам нужно сделать без ffmpeg на устройстве Android:

Начать с: https://github.com/google/grafika

Ответ на ваш вопрос между Воспроизвести видео (PlayMovieActivity.java) и Приложение Record Gl (RecordFBOActivity.java).

Шаги:

  • Установите mInputWindowSurface как входную поверхность видеокодера.

  • Декодирование кадра из видеопотока с использованием MoviePlayer в качестве видео (внешней) текстуры.

  • Нарисуйте эту видео текстуру на поверхности.

  • Наведите водяной знак на ту же поверхность поверх видео текстуры.

  • Сообщите MediaCodec, что поверхность готова для кодирования
    ( mVideoEncoder.frameAvailableSoon();, mInputWindowSurface.setPresentationTime(timeStampNanos); )... goto шаг 2.

Не забудьте настроить скорость декодирования. Просто удалите SpeedControlCallback, который в примере установлен для декодирования видео 60 FPS.

Преимущества этого способа:

  • Media Codec использует аппаратный декодер/кодировщик для обработки видео.

  • Вы можете изменить скорость передачи видео результата.

Ответ 4

Это то, что сработало для меня:

ffmpeg -i input.avi -i logo.png -filter_complex 'overlay=10:main_h-overlay_h-10' -strict -2 output.avi

ffmpeg рекомендовал использовать -strict -2 inorder для использования экспериментальных кодеков. без включения, принятый ответ выше не работает.