FFmpeg на Android

187 Jag [2011-01-18 18:18:00]

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

  • У вас есть шаги/процедуры/код/​​пример по интеграции FFmpeg на Android/StageFright?

  • Не могли бы вы посоветовать мне, как я могу использовать эту библиотеку для воспроизведения мультимедиа?

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

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

android ffmpeg stagefright android-ffmpeg


9 ответов


99 yonilevy [2011-01-27 21:26:00]

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

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

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

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

Удачи:)


62 mk.. [2012-03-27 11:32:00]

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

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

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

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

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

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

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


Видео = Codec + Muxer + Demuxer

codec = encoder + Decoder

= > Видео = кодировщик + декодер + Muxer + Demuxer (Mpeg4 + Mpeg4 + avi + avi - пример для контейнера avi)


Аудио = Codec + Muxer + Demuxer

codec = encoder + Decoder

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


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

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

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

Ex, для avi вам необходимо включить следующее. mpeg4 Encoder, mpeg4-декодер, mp2-кодировщик, mp2-декодер, avi-мультиплексор, 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)

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

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


11 Guy [2012-10-31 14:15:00]

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


10 Nick [2011-06-24 14:33:00]

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

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

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


5 jmartinalonso [2015-05-18 21:02:00]

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

Дополнительная информация о http://hiteshsondhi88.github.io/ffmpeg-android-java/


3 dentex [2013-07-02 17:38:00]

Вдохновленный многими другими 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.
        }
    }
}

2 Mixaz [2014-11-28 18:04:00]

Странно, что этот проект не упоминался: AndroidFFmpeg из Appunite

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


1 Madhavan Malolan [2017-10-27 14:12:00]

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

https://github.com/madhavanmalolan/ffmpegandroidlibrary


-1 hyiltiz [2017-12-01 03:57:00]

Из системных настроек > о телефоне > юридическая информация > системные лицензии на веб-просмотр, кажется, ffmpeg включен как часть ОС Android (8.0.0, Nexus 5X). Было бы замечательно, что мы могли бы получить доступ к этому, вместо того, чтобы быть другим по своему усмотрению.

license page in Android