FFmpeg на Android - PullRequest
       94

FFmpeg на Android

198 голосов
/ 18 января 2011

Я получил скомпилированный FFmpeg (libffmpeg.so) на Android.Теперь мне нужно создать приложение вроде RockPlayer или использовать существующую мультимедийную среду Android для вызова FFmpeg.

  1. Есть ли у вас шаги / процедуры / код / ​​пример для интеграции FFmpeg в Android / StageFright?

  2. Подскажите, пожалуйста, как мне использовать эту библиотеку для воспроизведения мультимедиа?

  3. У меня есть требование, когда у меня уже есть аудио ивидеопотоки, которые мне нужно передать в FFmpeg и декодировать / визуализировать.Как я могу сделать это на Android, поскольку API-интерфейсы IOMX основаны на OMX и не могут подключить здесь FFmpeg?

  4. Также я не смог найти документацию по API FFmpeg, которую необходимо использовать длявоспроизведение.

Ответы [ 9 ]

105 голосов
/ 27 января 2011

Вот шаги, которые я прошел, чтобы заставить ffmpeg работать на Android:

  1. Сборка статических библиотек ffmpeg для Android.Это было достигнуто за счет создания порта Android ffmpeg от olvaffe ( libffmpeg ) с использованием Android Build System .Просто поместите источники в / external и make вдали.Вам также необходимо извлечь bionic (libc) и zlib (libz) из сборки Android, поскольку от них зависят библиотеки ffmpeg.
  2. Создать динамическую библиотеку, упаковывающую функциональность ffmpeg с помощью Android NDK .Там много документации о том, как работать с NDK.По сути, вам нужно написать некоторый код на C / C ++ для экспорта необходимых вам функций из ffmpeg в библиотеку, с которой java может взаимодействовать через JNI.NDK позволяет вам легко ссылаться на статические библиотеки, которые вы сгенерировали на шаге 1, просто добавьте строку, похожую на эту в Android.mk: LOCAL_STATIC_LIBRARIES := libavcodec libavformat libavutil libc libz

  3. Используйте ffmpeg-упаковка динамической библиотеки из ваших Java-источников.Там достаточно документации по JNI, все должно быть в порядке.

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

Удачи:)

66 голосов
/ 27 марта 2012

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

Теперь, чтобы ответить на вопрос как использовать эту библиотеку , я бы сказал, что это не так просто написать здесь. Но я могу помочь вам следующим образом .

1) В каталоге исходного кода ffmpeg у вас есть output_example.c или api_example.c . Здесь вы можете увидеть код, в котором выполняется кодирование / декодирование. Вы получите представление о том, какой API внутри ffmpeg следует вызывать. Это будет ваш первый шаг.

2) Dolphin player - проект с открытым исходным кодом для Android. В настоящее время есть ошибки, но разработчики работают постоянно. В этом проекте у вас есть готовая настройка, которую вы можете использовать, чтобы продолжить расследование. Вот ссылка на проект с code.google.com или запустите команду " git clone https://code.google.com/p/dolphin-player/" в терминале. Вы можете увидеть два проекта с именами P и P86. Вы можете использовать любой из них.

Дополнительный совет, который я хотел бы предложить, заключается в том, что при сборке кода ffmpeg внутри build.sh вам необходимо включить muxers / demuxers / encoders / decoders тех форматов, которые вы хотите использовать. В противном случае соответствующий код не будет включен в библиотеки. Мне потребовалось много времени, чтобы понять это. Мысль поделиться этим с вами.

Несколько основ: Когда мы говорим видеофайл, например, avi, это комбинация аудио и видео

Видеофайл = Видео + Аудио


Видео = Кодек + Muxer + Demuxer

кодек = кодер + декодер

=> Видео = кодер + декодер + мультиплексор + демультиплексор (Mpeg4 + Mpeg4 + avi + avi - пример для контейнера avi)


Аудио = Кодек + Muxer + Demuxer

кодек = кодер + декодер

=> Аудио = кодер + декодер + Muxer + Demuxer (mp2 + mp2 + avi + avi - пример для контейнера avi)


Кодек (имя получено из комбинации en * co * der / * dec * oder) - это только часть формата, которая определяет алгоритмы, используемые для кодирования / декодирования кадра. AVI - это не кодек, это контейнер, который использует видеокодек Mpeg4 и аудиокодек mp2.

Muxer / demuxer используется для объединения / отделения кадров от файла, используемого при кодировании / декодировании.

Так что, если вы хотите использовать формат AVI, вам нужно включить видео компоненты + аудио компоненты.

Например, для avi необходимо включить следующее. Кодер mpeg4, декодер mpeg4, кодер mp2, декодер mp2, avi muxer, avi demuxer.

phewwwwwww ...

Программно build.sh должен содержать следующий код:

--enable-muxer=avi --enable-demuxer=avi (Generic for both audio/video. generally Specific to a container)
--enable-encoder=mpeg4 --enable-decoder=mpeg4(For video support)
--enable-encoder=mp2 --enable-decoder=mp2 (For Audio support)

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

Спасибо, нужна помощь, пожалуйста, дайте мне знать.

12 голосов
/ 31 октября 2012

Самая простая в создании, простая в использовании реализация, которую я нашел, сделана командой theguardianproject: https://github.com/guardianproject/android-ffmpeg

11 голосов
/ 24 июня 2011

Я сделал небольшой проект по настройке и сборке X264 и FFMPEG с использованием Android NDK. Главное, чего не хватает, - это приличного интерфейса JNI, чтобы сделать его доступным через Java, но это простая часть (относительно). Когда я подойду к созданию интерфейса JNI, подходящего для моих собственных нужд, я настаиваю на этом.

Преимущество по сравнению с системой сборки olvaffe заключается в том, что для сборки библиотек не требуются файлы Android.mk, просто используются обычные make-файлы и набор инструментов. Это значительно снижает вероятность прекращения работы при извлечении нового изменения из FFMPEG или X264.

https://github.com/halfninja/android-ffmpeg-x264

7 голосов
/ 22 ноября 2018

После долгих исследований, сейчас это самая обновленная скомпилированная библиотека для Android, которую я нашел:

https://github.com/bravobit/FFmpeg-Android

  • В данный момент используется FFmpeg release n4.0-39-gda39990
  • Включает FFmpeg и FFProbe
  • Содержит интерфейс Java для запуска команд
  • FFprobe или FFmpeg можно удалить из APK, проверьте вики https://github.com/bravobit/FFmpeg-Android/wiki
6 голосов
/ 18 мая 2015

Для создания своего приложения FFMPEG я использовал этот проект (https://github.com/hiteshsondhi88/ffmpeg-android-java), поэтому мне не нужно ничего компилировать. Я думаю, что это простой способ использовать FFMPEG в наших приложениях для Android.

Подробнее о http://hiteshsondhi88.github.io/ffmpeg-android-java/

4 голосов
/ 02 июля 2013

Вдохновленный многими другими реализациями FFmpeg для Android (в основном, guadianproject ), я нашел решение (также с поддержкой Lame).

(lame и FFmpeg: https://github.com/intervigilium/liblame и http://bambuser.com/opensource)

для вызова FFmpeg:

new Thread(new Runnable() {

    @Override
    public void run() {

        Looper.prepare();

        FfmpegController ffmpeg = null;

        try {
            ffmpeg = new FfmpegController(context);
        } catch (IOException ioe) {
            Log.e(DEBUG_TAG, "Error loading ffmpeg. " + ioe.getMessage());
        }

        ShellDummy shell = new ShellDummy();
        String mp3BitRate = "192";

        try {
            ffmpeg.extractAudio(in, out, audio, mp3BitRate, shell);
        } catch (IOException e) {
            Log.e(DEBUG_TAG, "IOException running ffmpeg" + e.getMessage());
        } catch (InterruptedException e) {
            Log.e(DEBUG_TAG, "InterruptedException running ffmpeg" + e.getMessage());
        }

        Looper.loop();

    }

}).start();

и обработки вывода консоли:

private class ShellDummy implements ShellCallback {

    @Override
    public void shellOut(String shellLine) {
        if (someCondition) {
            doSomething(shellLine);
        }
        Utils.logger("d", shellLine, DEBUG_TAG);
    }

    @Override
    public void processComplete(int exitValue) {
        if (exitValue == 0) {
            // Audio job OK, do your stuff: 

                            // i.e.             
                            // write id3 tags,
                            // calls the media scanner,
                            // etc.
        }
    }

    @Override
    public void processNotStartedCheck(boolean started) {
        if (!started) {
                            // Audio job error, as above.
        }
    }
}
3 голосов
/ 28 ноября 2014

Странно, что этот проект не был упомянут: AndroidFFmpeg от Appunite

Он содержит довольно подробные пошаговые инструкции для копирования / вставки в командную строку, для таких ленивых людей, как я)

2 голосов
/ 27 октября 2017

У меня была такая же проблема, я нашел здесь большинство ответов от.В итоге я написал оболочку для FFMPEG для доступа из Android с помощью одной строки кода.

https://github.com/madhavanmalolan/ffmpegandroidlibrary

...