Добавление ресурса изображения через видеофайл с SD-карты с помощью ffmpeg или MediaMuxer для Android

Я застрял в этой области, в которой мне не комфортно работать.

Вот что я сделал до сих пор:

  • Создал машину Ubuntu VirtualBox
  • Загружена последняя версия ffmpeg, которая составляет 2.3.3
  • Скомпилированный ffmpeg для совместимости с armv7-a, поэтому в итоге я получаю две папки: include и lib. В include у меня есть заголовки и в libs файлы * .so (как и в http://www.roman10.net/how-to-build-ffmpeg-with-ndk-r9/ )

Введите описание изображения здесь

Я создал новый проект для Android и создал jni-папку, и это как далеко я пошел … Даже это, когда вся борьба была новой для Linux и компиляции, заняла у меня почти неделю.

Добавление водяного знака в ffmpeg Я считаю, что это делается на libavfilter? Я должен копаться в этом вопросе, однако исходный ffmpeg, который мне нужно перевести в мой проект, это:

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

Насколько я сейчас изучаю, мне нужно сделать внутри jni:

  • Создайте файл add_watermark.c, в котором мне нужно как-то вызвать функцию, которая выполняет вызов наложения фильтра
  • Создайте Android.mk для загрузки этого и необходимых библиотек ffmpeg

    LOCAL_PATH: = $ (вызов my-dir)

    Включают $ (CLEAR_VARS)

    LOCAL_MODULE: = добавочный водяной знак

    LOCAL_SRC_FILES: = add-watermark.c

    LOCAL_LDLIBS: = -llog -ljnigraphics -lz

    LOCAL_SHARED_LIBRARIES: = libavformat libavcodec libswscale libavutil

    Включают $ (BUILD_SHARED_LIBRARY)

    $ (Вызов import-module, ffmpeg-2.3.3 / android / armv7-a)

  • Создать Application.mk

    APP_ABI: = armeabi-v7a

    APP_PLATFORM: = android-8

  • Запустите ndk-build и используйте сгенерированные библиотеки в моем проекте Android.

Мне действительно нужна помощь в продолжении, поэтому каждый ответ получен с большим вниманием и удовольствием.

Позже Edit: Можно ли каким-то образом построить ffmpeg.exe в качестве библиотеки и вызвать ее главную с теми же параметрами, что и исходный exe? Я не хочу запускать ffmpeg как автономный исполняемый файл, но интегрировать его в проект. Что-то вроде http://www.roman10.net/how-to-port-ffmpeg-the-program-to-androidideas-and-thoughts/. Какими недостатками был бы этот подход?

Позже отредактируйте 2: если это возможно с помощью MediaMuxer или других API-интерфейсов, добавленных в Android 4.3, я открыт для него, где приведены примеры кода. Я просмотрел образцы MediaCodec и MediaMuxer также Grafik и не нашел подходящего способа делать то, что хотел. Я предпочитаю ffmpeg подход лучше, если он работает

Ffmpeg не самая простая библиотека в мире. Одно дело – использовать их предварительно скомпилированный исполняемый файл (как вы это делали, используя ffmpeg), а другой совершенно другой – использовать свои библиотеки для включения мультимедийной поддержки в ваше собственное приложение.

Я рекомендую вам следовать этому руководству:

http://dranger.com/ffmpeg/tutorial01.html

Он довольно старый, и некоторые функции уже устарели или вообще не существуют, но Googling немного скажет вам, какие новые функции вам нужны.

В учебнике вы сможете воспроизводить видеофайл, как аудио, так и видео. Библиотека SDL требуется также для учебника, чтобы иметь возможность воспроизводить звук через звуковую карту.

Как только вы сможете это сделать, вам нужно будет перекрывать растровое изображение над видео, которое от вашего вызова до ffmpeg, я думаю, что это может быть сделано с каким-то фильтром (я не уверен в этом).

Кроме того, поскольку вы сказали, что вы новичок в Linux, я рекомендую вам оставаться в Windows. Есть довольно библиотеки для разработки с C ++ и Android (то есть Qt), которые более или менее легко настраиваются и перекрестно компилируют некоторые базовые примеры для Android. С этими библиотеками вы можете построить ffmpeg для Android и рассказать весь проект, где находятся ваши библиотеки, поэтому они автоматически включаются в .apk.

Но кроме того, вы также можете скомпилировать для ПК и посмотреть результаты, пока не получите то, что ожидаете. ТОЛЬКО ТО, ЧТО, вы переходите в мир Android и делаете заключительные тесты там.

Подводя итог, мой рабочий процесс будет следующим:

  1. Оставайтесь в Windows, поэтому у вас не возникнут проблемы с ОС.
  2. Используйте некоторые IDE / библиотеки, которые позволяют вам скомпилировать код C / C ++ для Android (предлагаю Qt)
  3. Создайте библиотеки ffmpeg как для ПК, так и для Android. 3b. Создавайте библиотеки SDL как для ПК, так и для Android (чтобы вы могли видеть и слушать видео).
  4. Пройдите учебник и настройте базовый видеопроигрыватель на ПК.
  5. Добавьте изменения растровых изображений и т. Д. На ПК.
  6. Перекрестное сопоставление с Android и внесение окончательных изменений (при необходимости).

https://github.com/rowntreerob/android-ffmpeg/blob/master/Project/src/com/b2bpo/media/notes/RecorderActivity.java

Вы можете попытаться вырвать метод onFfmpegButton () из приведенного выше, сбросить фактические плагины CLI, которые вы хотите использовать для ffmpeg, интегрированный JNI-вызов – не автономный – и посмотреть, делает ли он слияние нужной фотографии.

Если вам просто нужна информация об интеграции JNI в ffmpeg, см. Проект halfninja в git и папке «videokit» в этом проекте для интеграции вызовов ffmpeg.main () с android JNI.

Я успешно добился того, что вам нужно. Хотя теория довольно проста, детали реализации очень затрудняют работу.

Ваше решение начинается здесь: скачать проект halfninja здесь: https://github.com/halfninja/android-ffmpeg-x264 и следовать инструкциям к письму.

Некоторые примечания:

  • Он не будет работать с более новыми версиями ffmpeg, например, вы должны использовать версию ffmpeg, на которую указывает подмодуль git.
  • Он не будет работать с новыми ndks. Вы должны установить тот, который он там перечисляет (r5c).

После успешного компиляции вы получите библиотеку .so, которая имеет метод «run», который вы можете вызвать для запуска ffmpeg с теми же параметрами, которые он получает в командной строке.

Также:

  • В приведенном выше коде содержится файл ffmpeg.c, который запускает «основной» метод, но использует глобальные переменные. Это означает, что ваш код не будет повторно включен. Вызов ffmpeg :: main дважды не будет работать. Вы должны добавить код инициализации самостоятельно, когда это будет сделано, или создать вторую библиотеку, которая динамически загружает эту библиотеку в C и выгружает ее по завершении.
  • Полученная библиотека будет большой, так как она включает весь компонент ffmpeg и раздувает ваш apk. Вам нужно будет изменить файл сборки, чтобы включить только те компоненты ffmpeg, которые вам нужны. Например, изменить configure_ffmpeg для работы с minimal_featureset , и – можно использовать только кодеки, которые вам нужны.

EDIT: для mp4 w / aac используйте следующий файл configure_ffmpeg:

 --enable-muxer=mp4 --enable-encoder=libx264 --enable-libx264 \ --enable-encoder=h264 --enable-decoder=h264 --enable-demuxer=h264 --enable-muxer=h264 --enable-parser=h264 \ --enable-protocol=file \ --enable-hwaccels \ --enable-demuxer=mov --enable-decoder=aac --enable-decoder=aac_latm --enable-encoder=aac --enable-parser=aac --enable-demuxer=aac --enable-bsf=aac_adtstoasc \ --enable-encoder=aac --enable-parser=aac \ --enable-decoder=mpeg4 --enable-encoder=mpeg4 --enable-parser=mpeg4video --enable-demuxer=m4v" 

В конце концов, это был единственный учебник, который помог мне сделать полную сборку и получить рабочую библиотеку для моего проекта:

https://enoent.fr/blog/2014/06/20/compile-ffmpeg-for-android/