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.
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 с помощью одной строки кода.
-1 hyiltiz [2017-12-01 03:57:00]
Из системных настроек > о телефоне > юридическая информация > системные лицензии на веб-просмотр, кажется, ffmpeg включен как часть ОС Android (8.0.0, Nexus 5X). Было бы замечательно, что мы могли бы получить доступ к этому, вместо того, чтобы быть другим по своему усмотрению.