Добавление ресурса изображения поверх видеофайла с SD-карты с помощью ffmpeg или MediaMuxer для Android
Я застрял в этой области, в которой мне совсем не комфортно работать.
Вот что я сделал до сих пор:
- Сделал машину Ubuntu VirtualBox
- Скачал последнюю версию ffmpeg 2.3.3
- Скомпилированный ffmpeg для совместимости с armv7-a, поэтому в итоге я получаю две папки: include и lib. В том числе у меня есть заголовки и в файлах *.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:= $(позвоните в мой каталог)
включает $ (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)
$ (call import-module, ffmpeg-2.3.3 / android / armv7-a)
создать Application.mk
APP_ABI: = armeabi-v7a
APP_PLATFORM: = Android-8
запустите ndk-build и используйте сгенерированные библиотеки в моем проекте Android.
Мне действительно нужна помощь в продолжении, поэтому каждый ответ получен с большим вниманием и удовольствием.
Позже Редактирование: Можно ли каким-то образом собрать ffmpeg.exe как библиотеку и вызвать ее main с точно такими же параметрами, как и у исходного 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 лучше, если он работает
4 ответа
Я успешно достиг того, что вам нужно. Хотя теория довольно проста, детали реализации очень затрудняют запуск чего-либо.
Ваше решение начинается здесь: Загрузите проект Halfninja здесь: https://github.com/halfninja/android-ffmpeg-x264 и следуйте инструкциям к письму.
Некоторые заметки:
- он не будет работать с более новыми версиями ffmpeg, например, вы должны использовать версию ffmpeg, на которую указывает подмодуль git.
- это не будет работать с новыми Nndks. Вы должны установить тот, который он перечисляет там (r5c).
После успешной компиляции вы получите.so lib с методом run, который вы можете вызвать для запуска ffmpeg с теми же параметрами, которые он получает в командной строке.
Также:
- Приведенный выше код содержит файл ffmpeg.c, который запускает метод "main", но использует глобальные переменные. это означает, что ваш код не будет повторно введен. Двойной вызов ffmpeg::main не сработает. Вы должны будете добавить код инициализации самостоятельно, когда закончите, ИЛИ создать вторую библиотеку, которая динамически загружает эту библиотеку в C и выгружает ее, когда закончите.
- Полученная библиотека будет большой, так как включает в себя все компоненты ffmpeg и будет раздувать ваш apk. Вам нужно изменить файл сборки, чтобы он включал только те компоненты ffmpeg, которые вам нужны. например, изменить
configure_ffmpeg
работать сminimal_featureset
, а также--enable
только нужные вам кодеки.
РЕДАКТИРОВАТЬ: Для 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"
ffmpeg - не самая простая в мире библиотека для использования. Одно дело - использовать их предварительно скомпилированный исполняемый файл (как вы это сделали, используя ffmpeg), а другое совершенно другое - использовать их библиотеки для включения поддержки мультимедиа в ваше собственное приложение.
Я рекомендую вам следовать этому уроку:
http://dranger.com/ffmpeg/tutorial01.html
Он довольно старый, и некоторые функции уже устарели или вообще не существуют, но поиск в Google немного подскажет, какие новые функции вам нужны.
В этом уроке вы сможете воспроизвести видеофайл, как аудио, так и видео. Библиотека SDL также необходима для обучения, чтобы можно было воспроизводить звук через звуковую карту.
Как только вы сможете это сделать, вам нужно будет наложить растровое изображение на видео, что, по вашему звонку в ffmpeg, я думаю, что это может быть сделано с помощью какого-то фильтра (я не уверен в этом).
Кроме того, поскольку вы сказали, что вы новичок в Linux, я рекомендую вам остаться на Windows. Существуют красивые библиотеки для разработки на C++ и Android (например, Qt), которые более или менее просты в настройке и кросс-компиляции некоторых основных примеров для Android. С помощью этих библиотек вы можете собрать ffmpeg для Android и сообщить всему проекту, где находятся ваши библиотеки, чтобы они автоматически включались в.apk.
Но кроме того, вы также можете сначала скомпилировать для ПК и увидеть результаты, пока не получите то, что ожидаете. ТОЛЬКО ПОТОМ вы переходите в мир Android и проводите там последние тесты.
Подводя итог, мой рабочий процесс будет следующим:
- Оставайтесь в Windows, чтобы не было проблем, связанных с ОС.
- Используйте некоторые IDE / библиотеки, которые позволяют вам компилировать код C / C++ для Android (я предлагаю Qt)
- Создайте библиотеки ffmpeg для ПК и Android. 3b. Создайте библиотеки SDL для ПК и Android (чтобы вы могли просматривать и прослушивать видео).
- Просмотрите учебник и настройте основной видеоплеер на ПК.
- Добавьте ваши растровые модификации и так на ПК.
- Сделайте кросс-компиляцию на Android и сделайте окончательные модификации (при необходимости).
В конце концов, это был единственный урок, который помог мне сделать полную сборку и получить рабочую библиотеку для моего проекта:
https://enoent.fr/blog/2014/06/20/compile-ffmpeg-for-android/
Вы можете попробовать скопировать метод onFfmpegButton() из вышеприведенного, сбросить фактические параметры CLI, которые вы хотите для ffmpeg, встроенный вызов JNI - не автономный - и посмотреть, выполняет ли он слияние нужной фотографии.
Если вы просто хотите получить информацию об интеграции JNI в ffmpeg, посмотрите проект halfninja на git и папку 'videokit' в этом проекте для интеграции вызовов ffmpeg.main() с android JNI.