Android ffmpeg android studio

Android ffmpeg android studio

FFMpeg/FFprobe compiled for Android. Execute FFmpeg & FFprobe commands with ease in your Android project.

This project is a continued fork of FFmpeg Android Java by WritingMinds. This fork fixes the CANNOT LINK EXECUTABLE ffmpeg: has text relocations issue on x86 devices along with some other bugfixes, new features and the newest FFmpeg builds.

Bravobit FFmpeg-Android runs on the following architectures:

FFmpeg in this project was built with the following libraries:

  • x264 r2851 ba24899
  • libpng 1.6.21
  • freetype2 2.8.1
  • libmp3lame 3.100
  • libvorbis 1.3.5
  • libvpx v1.6.1-1456-g7d1bf5d
  • libopus 1.2.1
  • fontconfig 2.11.94
  • libass 0.14.0
  • fribidi 0.19.7
  • expat 2.1.0
  • fdk-aac 0.1.6
  • Uses the latest FFmpeg release n4.0-39-gda39990
  • Uses native CPU capabilities on ARM architectures
  • FFprobe is bundled in this library too
  • Enabled network capabilities
  • Multithreading

Include the dependency

Check if FFmpeg is supported

To check whether FFmpeg is available on your device you can use the following method.

This is all you have to do to load the FFmpeg library.

Run FFmpeg command

In this sample code we will run the ffmpeg -version command.

Stop (or Quit) the FFmpeg process

If you want to stop the running FFmpeg process, simply call .sendQuitSignal() on the FFtask that is running:

NOTE: This will result in onFailure being called instead of onSuccess .

Check if FFprobe is supported

To check whether FFprobe is available on your device you can use the following method.

This is all you have to do to load the FFprobe library.

Run FFprobe command

In this sample code we will run the ffprobe -version command.

Источник

Говорящая панда или что можно сделать с FFmpeg и OpenCV на Android

Дисклеймер

Некоторые описываемые вещи наверняка покажутся многим очевидными, тем не менее, для меня, как для разработчика под Windows, эти задачи оказались новыми и их решение было не очевидным, поэтому описание технических деталей я постарался сделать максимально простым и понятным для людей, не имеющих большого опыта работы с Android NDK и всем, что с ним связано. Некоторые решения были найдены интуитивно, и поэтому, скорее всего, они не совсем «красивые».

Предыстория

Идея Android приложения, где бы использовались FFmpeg и OpenCV, появилась после просмотра одного рекламного ролика про минеральную воду Витутас (можете поискать на Youtube). В этом ролике иногда мелькали фото разных животных, которые вращали человеческими глазами, шевелили губами и уговаривали зрителя купить эту воду. Выглядело это довольно забавно. В общем, возникла мысль: что если дать пользователю возможность самому делать подобные ролики, причем не с компьютера, а с помощью своего телефона?

Разумеется, сперва поискали аналоги. Что-то более или менее похожее было найдено в AppStore для iPhone, причем там процесс создания ролика был не очень удачным: выбираешь картинку, размечаешь на ней одну область, и потом камерой в этой области что-то снимаешь, то есть речь о том, чтобы наложить на картинку в разных местах хотя бы два глаза и рот вообще не шла. В Google Play же вообще ничего такого не было. Максимально близкие программы с похожим функционалом были такие, где на фото можно наложить анимированные элементы из ограниченных наборов.

Одним словом, конкурентов мало, поэтому было принято решение приложение всё же делать.

Выбор технологий

Сразу возник логичный вопрос: «А как это все сделать?». Потратив дня два на изучение всяких библиотек для обработки видео и изображений, остановился на FFmpeg и OpenCV.

Из плюсов можно перечислить следующие:

  • обе библиотеки написаны на C/C++, то есть объединить их уже теоретически можно;
  • бесплатные с открытым кодом: FFmpeg можно собрать под LGPL, а OpenCV вообще распространяется под лицензией BSD;
  • очень быстрые, да и вообще крутые с какой стороны не посмотри.

Из минусов:

  • написаны на C/C++;
  • все же FFmpeg сложноватый для того, чтобы в его коде быстро разобраться и понять, где надо что поменять.

Схема использования вырисовывалась такая: OpenCV формирует каждый кадр видео ряда (например, помещает на картинку, глаза и рот), передает этот кадр каким-то образом в FFmpeg, а тот в свою очередь формирует из этих кадров видеопоток, параллельно не забывая про аудио.

Читайте также:  Как самому собирать прошивки для андроид

Надо признаться в том, что так как опыта разработки под Android было мало, а под Windows много, то прежде чем начать ковыряться в Eclipse и NDK я сделал маленькую программку в Visual Studio, которая доказала, что сама идея использовать FFmpeg и OpenCV имеет право на жизнь и, самое главное, что есть способ реализовать их взаимодействие. Но о реализации взаимодействия этих библиотек будет написано чуть позже, а это скорее легкая рекомендация на тему того, что лучше все же потратить время и проверить какую-то идею на технологиях, в которых разбираешься лучше всего, чем сразу с головой лезть во что-то новое.

Насчет же компиляции FFmpeg в Visual Studio — сделать это оказалось на удивление легко, но эта статья все же об Android, поэтому если тема FFmpeg в Visual Studio интересна, то напишите об этом, и я постараюсь найти время и написать инструкцию о том, как это сделать.

Итак, проверив, что идея объеденить FFmpeg и OpenCV работает, я приступил к разработке непосредственно Android приложения.

План был таков:

  1. Компилируем и собираем FFmpeg и OpenCV под Android.
  2. Пишем код их взаимодействия.
  3. Используем это все в Java коде приложения.

Делать это все решил в Eclipse, а не в Android Studio — как-то она мне на момент начала разработки показалась сыроватой и не очень удобной.

FFmpeg, Android, NDK, Eclipse, Windows

Первым делом, как все нормальные люди, я стал искать в интернете инструкции о том, как сделать кросс-компиляцию FFmpeg для Android в Windows. Статьи есть, предлагаются даже какие-то наборы make-файлов, есть что-то на гитхабе, но по ним мне не удалось это сделать. Возможно из-за отсутсвия опыта работы с этим всем, возможно из-за ошибок в этих инструкциях и make-файлах. Обычно подобные инструкции пишет человек, который хорошо разбирается в описываемых технологиях и поэтому опускает какие-то «очевидные» нюансы, и получается, что новичку этим невозможно пользоваться.

В общем, пришлось с нуля сделать все самому. Ниже приводится примерная последовательность действий.

0. Предустановки

Скачиваем и устанавливаем: Eclipse с CDT, Android SDK, NDK, cygwin и OpenCV Android SDK. Если есть необходимость поддержать Android на x86, то следует скачать еще и yasm — он нужен, чтобы сделать кросс-компиляцию *.asm файлов, но об этом позже.

Инструкции по установке и настройке этого всего находятся на сайтах, откуда они собственно и скачиваются, а насчет установки и настройки NDK в Eclipse есть отличная статья на сайте opencv.org, которая выдается в гугле по запросу «OpenCV Introduction into Android Development», обязательно зайдите на нее.

1. Подготавливаем проект

Создаем в Eclipse новый проект Android приложения и ковертируем его в C/C++ проект (смотрите статью «OpenCV Introduction into Android Development»). На самом деле Android проект не сконвертируется полностью в C/C++, а в него просто добавится возможность работать с C/C++.

Скачиваем и распаковываем архив с кодом FFmpeg с сайта ffmpeg.org. Папку с кодом вида «ffmpeg-2.6.1» кидаем в папку «jni» проекта (если ее нет — создаем там же где лежат «res», «scr» и т. п.).

Теперь необходимо создать конфигурационные файлы (самый важный из них «config.h») и make-файлы для FFmpeg. Здесь возникает первый нюанс: существуюет три платформы Android устройств — Arm, x86, MIPS. Для каждой из этих архитектур нужны собрать свои файлы библиотек *.so (аналог *.dll в Windows). NDK позволяет это сделать — в него включены компилятор и линковщик для каждой платформы.

Для того, чтобы сгенерировать конфигурационные файлы в FFmpeg есть специальный скрипт, для запуска которого нам и нужно было установить cygwin. Итак, запускаем командную строку Cygwin Terminal и вводим приведенные ниже наборы команд.

Для устройств ARM:

Для устройств x86:

Для устройств MIPS:

Пояснения:

  1. Первые две команды — переход в папку с кодом FFmpeg, где лежит файл «configure» — это bash скрипт, который генерирует нужные нам файлы, в том числе и «config.h», который используется при компиляции;
  2. Далее мы создаем три временные переменные окружения PREBUILT, PLATFORM, TMPDIR, в первые две записываются пути к папкам в NDK, где лежат утилиты для кросс-компиляции под разные платформы, если в эти папки зайти, то там будет среди множества папок будет и папка «bin», в окторой и лежат компилятор и линковщик. TMPDIR — путь во временную папку, где скрипт при работе будет хранить временные свои файлы;
  3. Последняя команда это собственно запуск скрипта «configure» из папки «ffmpeg-2.6.1» с параметрами. Список всех возможных параметров скрипта с пояснениями выводятся по команде «./configure -h». Ниже описание тех параметров, которые мы используем:
    • параметр —enable-version3 – говорим скрипту, чтобы он сгенерировал такой конфигурационный файл, чтобы с помощью него можно было скомпилировать библиотеки FFmpeg которы будут под лицензией LGPL 3.0;
    • параметры —enable-shared и —disable-static – говорим скрипту, что хотим на выходе получить *.so файлы. Сделав это, то по идее в купе с LGPL мы сможем их линковать к своему коду на который LGPL не будет распространяться;
    • параметры —disable-ffmpeg —disable-ffplay —disable-ffprobe —disable-ffserver —disable-network – этими параметрами мы говорим скрипту, что нам не нужно создавать консольные программы (другими словами ffmpeg.exe, ffplay.exe и другие);
    • оставшиеся параметры понятны по своим названиям — мы говорим, что хотим сделать кросс-компиляцию, назначаем платформу (linux arm, mips или x86), прописываем скрипту пути к компилятору и линковщику, задаем путь к временной папке.
Читайте также:  Нет уведомлений viber android

Скрипт сгенерирует в папке «jni/ffmpeg-2.1.3» файл «config.h», «config.asm» и несколько make-файлов.

2. Make-файлы, компиляция и сборка

Итак, на данном этапе у нас уже есть: проект Android-приложения в Eclipse, в папке «jni/ffmpeg-2.1.3» лежит код с FFmpeg, и только что мы сгенерировали нужный нам файл «config.h». Теперь надо сделать make-файлы, чтобы это все можно было скомпилировать и получить *.so файлы которые мы сможем использовать в Android приложении.

Я пробовал использовать для компиляции make-файлы, сгенерированные скриптом, но у меня не получилось, скорее всего, по причине кривизны рук. Поэтому я решил сделать свои собственные make-файлы с комментариями и инклюдами.

Источник

Android ffmpeg android studio

Supported android ABI’s

  • armeabi*
  • armeabi-v7a
  • arm64-v8a
  • x86
  • x86_64
  • mips*
  • mips64*

Note: *-Deprecated in android ndk-r16. Will be removed in ndk-r17.
see https://developer.android.com/ndk/guides/abis.html#Supported ABIs
ffmpeg-andorid releases > v1.5.0 will only verify ABIS=(«armeabi-v7a» «arm64-v8a» «x86» «x86_64»)

  • Set environment ANDROID_NDK variable; not all ndk releases work with all modules/ABIS combinations
    • export ANDROID_NDK=
      e.g. export ANDROID_NDK=/opt/android/android-ndk-r17c (recommended);
    • Note: android-ndk-r18b will have problem in some module builds e.g. lame
  • If necessary, fetch and update all libraries source (before build);
    • review and edit ./init_update_libs.sh file for your desired modules’ versions, then run
    • ./init_update_libs.sh
    • The default codec module extracted sub-directories are ffmpeg, libvpx, x264 and lame
    • Optionally, go to the respective directory for each sub-module, and execute ./configure without option;
      The configure process may list any missing sdk build tools, please install before continue
    • The actual configure with options for each submodule build is done in each submodule _ _build.sh build script
  • Edit ./ffmpeg-android_build.sh [#1] and ./_settings.sh [#2];
    a. remove any of the codec sub-modules or architectures you wish to be excluded from the build
    b. add «ffmpeg» only to [#1] if you want to build standalone ffmpeg without inclusion of the sub-modules integration
    c. the default values are defined as:
    • MODULES=(«vpx» «x264» «lame») [#1]
    • ABIS=(«armeabi-v7a» «arm64-v8a» «x86» «x86_64») [#2]
  • To support 64-bit libraries built, ensure _settings.sh#ANDROID_API=21 (min API for 64-bit library build).
    Note: application.mk in Android Studio i.e. APP_PLATFORM := android-21 i.e. both must use the same API
  • Use the following commands to compile ffmpeg for all or custom defined modules/ABI’s combinations
    • ./ffmpeg-android_build.sh
      : (combinaiton as specified in the [#1] and [#2])
    • ./ffmpeg-android_build.sh armeabi-v7a
      : (i.e. selected cpu with all predefined codec modules)
    • ./ffmpeg-android_build.sh armeabi-v7a x264
      : (i.e. selected cpu with only x264 codec module)
  • All the generated static/shared libraries and includes files are installed in ./jni/ /android/.

Linking with versioned shared library in Android NDK

  • Note: Manual changes as outlined below are not further required.
    the latest _vpx_build.sh has included the scripts to perform the following steps automatically.
  • Android has an issue with loading versioned .so shared libraries e.g. x264:
  • Causing error during run: java.lang.UnsatisfiedLinkError: dlopen failed: library «libx264.so.147» not found
  • Perform the following patches, if you want to link with shared .so libraries for x264.
    1. use GHex to change file content «libx264.so.147» to «libx264_147.so»
    2. change filename from libx264.so.147 to libx264_147.so
    3. Note: the .so filename must match with the file changed content

The scripts has been verified working with the following configurations:

  • NDK version: ndk-r17c (build may failed with lower or higher versions — see below)
  • ABIS: armeabi-v7a, arm64-v8a, x86, x86_64
  • MODULES (with applied patches): ffmpeg-v4.4, libvpx-v1.10.0, x264-v163, lame-v3.100
  • ANDROID_API: 21

x264 (v163, v161, v160, v157 and v152):

  • x264 option: —disable-asm
    Must exclude the option for arm64. Used by configure, config.mak and Makefile to define AS and to compile required *.S assembly files.
    Otherwise will have undefined references e.g. x264_8_. x264_10.
    However must include the option for x86 and x86_64; otherwise have relocate text, requires dynamic R_X86_64_PC32 etc when use in aTalk
  • ndk-r18b, ndk-r17c, ndk-16b, ndk-r15c (build all)

libvpx (v1.10.0, v.1.8.2, v1.8.0):

  • libvpx configure.sh needs patches to correctly build the arm64 with NDK standalone toolchains.
  • Valid for libvpx v1.8.0 only, option removed for libvpx v1.8.2+:
    When —sdk-path is specified, libvpx configure uses SDK toolchains compiler (gcc/g++);
    • ndk-r18b, ndk-r17c, ndk-r16b:
      To avoid missing stdlib.h and other errors, need to include the following two options for SDK toolchains:
      —extra-cflags=»-isystem $/sysroot/usr/include/$ -isystem $/sysroot/usr/include»
      —libc=$ => use standalone toolchains directory.
      libvpx v1.8.0 configure.sh has a problem configure this with SDK properly
    • ndk-r18b: gcc option has been removed
      build failed with: /home/cmeng/workspace/ndk/ffmpeg-android/toolchain-android/bin/aarch64-linux-android-ld: cannot find -lgcc
  • libvpx v1.8.0: When using standalone toolchains, i.e. omit —sdk-path;
    • ndk-r18b, ndk-r17c, ndk-r16b:
      Build ok with ABIS=(«arm64-v8a» «x86» «x86_64») but not «armeabi-v7a» and failed with:
      /tmp/vpx-conf-4350-25363.o(.ARM.exidx.text.main+0x0): error: undefined reference to ‘__aeabi_unwind_cpp_pr0’
  • For libvpx v1.8.2+
    • ndk-r18b, ndk-r17c, ndk-r16b:
      All built OK.
  • ndk-r18b — failed as lame need C++ instead of clang compiler
  • ndk-r17b — build all and can integrate with ffmpeg
  • ndk-r16b, ndk-r15c (build all)
  • PREFIX must use absolution path
  • Must include option —disable-asm for x86 and x86_64, otherwise
    libavcodec/x86/cabac.h:193:9: error: inline assembly requires more registers than available
    ffmpeg (v1.0.10) => must also include this option for arm/arm64 build, otherwise errors during compilation
  • ndk-r18b, ndk-r17c => give error on:
    libavdevice/v4l2.c:135:9: error: assigning to ‘int (*)(int, unsigned long, . )’ from incompatible type » SET_WRAPPERS();
    add to CFLAG: -DBIONIC_IOCTL_NO_SIGNEDNESS_OVERLOAD; see https://github.com/tanersener/mobile-ffmpeg/issues/48
  • ndk-r16b or lower => gives error on:
    libavformat/udp.c:290:28: error: member reference base type ‘__be32’ (aka ‘unsigned int’) is not a structure or union
    mreqs.imr_multiaddr.s_addr = ((struct sockaddr_in *)addr)->sin_addr.s_addr;
  • NDK verification status (build with clang/clang++ and API-21 unless otherwise specified):
  • Recommendation: use ndk-r17c (work for all) and API-21 unless you have other considerations.
  • clang support needs min ndk-r12c, but may not necessary works for all ABIS (64-bit built has problem)
  • Change _settings.sh with clang=>gcc and clang++=>g++ if you need lower ndk version
  • NDK >r18b has obsoleted the support for the gcc/g++

Set up Linux/Ubuntu development environment with the below build tools

  • sudo apt-get —quiet —yes install build-essential git autoconf libtool pkg-config gperf gettext yasm python-lxml

Patches for Sub-module

  • ./ffmpeg-android_build.sh includes the patches for the sub-modules
  • ffmpeg-android_patch.sh applies patches to the relevant sub-module with patch files from ./pathes directory
  • edit these files to include additional patches if required.
  • You may encounter this problem during the codec sub-module build, navigate to the respective sub-module directory:
    • Issue the command line i.e. configure —help to check for the available options
    • Refer to config.log of the sub-module for more info.
    • Refer to the configure file for more information on CPU types supported
    • Edit the script file to make the necessary modifications based on help and errors found in config.log

During sub-module built, you may encountered compilation or linker errors, changing ndk version
may help to resolve the issues. However it may create new problems in another areas.

Utilize Modern Compiler Flags to Address Potential Security Issues

  • Stack execution protection: LDFLAGS=»-z noexecstack»
  • Data relocation and protection (RELRO): LDLFAGS=»-z relro -z now»
  • Stack-based Buffer Overrun Detection: CFLAGS=”-fstack-protector-strong” if using GCC 4.9 or newer, otherwise CFLAGS=»-fstack-protector»
  • Position Independent Execution (PIE) CFLAGS=»-fPIE -fPIC» LDFLAGS=»-pie» (PIE for executables only)
  • Fortify source: CFLAGS=»-O2 -D_FORTIFY_SOURCE=2″
  • Format string vulnerabilities: CFLAGS=»-Wformat -Wformat-security»

All the information provided here are by trial and error; compiling and linkage are very sensitive to the
modules version, configure options, and the NDK version used. You are advice to build without any changes
to the scripts provided here to confirm working, before attempt to make any modifications.

Both the android NDK, ffmpeg and its sub-modules are in continous update, it is likely that
some of the defined ABI’s settings may need to be tweaked as submodule configure have new changes.

Please refer to the following sites which may offer solution for problems you may experience.

Источник

Читайте также:  Context menu in context menu android
Оцените статью