Обертка FFmpeg для Android
Мне удается скомпилировать ffmpeg и получить .so
файлы для разных арок, таких как amreabi, armeabi-v7a и т. д.
Мне удалось интегрировать эти готовые библиотеки в мой проект Android с помощью CMakeLists.txt
через собственный .cpp
обертка. Проблема в том, что у меня нет навыков в C++. Так что еще один способ использования ffmpeg
это позвонить main()
функция ffmpeg.c
, Эта ссылка описывает шаги, как это сделать.
В моем проекте:
состав
Application.mk
APP_ABI := armeabi-v7a
APP_PLATFORM := android-21
Android.mk
LOCAL_PATH := $(call my-dir)
#$(warning $(LOCAL_PATH))
include $(CLEAR_VARS)
LOCAL_MODULE := libffmpeg
LOCAL_LDLIBS := -llog -ljnigraphics -lz -landroid
LOCAL_CFLAGS := -Wdeprecated-declarations
ANDROID_LIB := -landroid
LOCAL_C_INCLUDES:=./ffmpeg
LOCAL_SRC_FILES := ffmpeg_controller.c ffmpeg.c ffmpeg_filter.c ffmpeg_opt.c cmdutils.c
LOCAL_SHARED_LIBRARIES := libavformat libavcodec libswscale libavutil libswresample libavfilter libavdevice
include $(BUILD_SHARED_LIBRARY)
$(call import-add-path,D:/My-Project/app/src/main/jni)
$(call import-module,ffmpeg/android/armeabi-v7a)
FFmpeg/ Android / armeabi-v7a / Android.mk
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE:= libavdevice
LOCAL_SRC_FILES:= lib/libavdevice-57.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE:= libavcodec
LOCAL_SRC_FILES:= lib/libavcodec-57.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE:= libavformat
LOCAL_SRC_FILES:= lib/libavformat-57.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE:= libswscale
LOCAL_SRC_FILES:= lib/libswscale-4.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE:= libavutil
LOCAL_SRC_FILES:= lib/libavutil-55.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE:= libavfilter
LOCAL_SRC_FILES:= lib/libavfilter-6.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE:= libswresample
LOCAL_SRC_FILES:= lib/libswresample-2.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
build.gradle
...
ndk {
abiFilters "armeabi", "armeabi-v7a"
}
...
packagingOptions {
exclude 'META-INF/LICENSE'
doNotStrip "*/armeabi/*.so"
doNotStrip "*/armeabi-v7a/*.so"
doNotStrip "*/x86/*.so"
doNotStrip "*/x86_64/*.so"
doNotStrip "*/arm64-v8a/*.so"
}
...
sourceSets.main {
jniLibs.srcDir 'src/main/libs'
jni.srcDirs = ["jni"] //disable automatic ndk-build call
}
lintOptions {
warning 'InvalidPackage'
warning 'MissingPermission'
warning 'MissingConstraints'
}
externalNativeBuild {
ndkBuild {
path 'src/main/jni/Android.mk'
}
}
После сборки проекта выдает много ошибок в ffmpeg/*.c
, ffmpeg/*.h
файлы и в jni/ffmpeg.c
, jni/cmdutils.c
и т. д. Ошибки похожи на "config.h не найден", "libavformat / os_support.h не найден". Если я добавлю config.h
подать в jni/
папка из ffmpeg/
и заменить libavformat/os_support.h
с ffmpeg/libavformat/os_support.h
тогда ошибки исчезли, но .c
Синтаксические ошибки все еще там. Согласно учебнику я не должен делать такие изменения в источниках, и все должно быть в порядке.
Что я сделал не так? Как еще я могу использовать инструмент командной строки ffmpeg в Android Project?
Версия Android NDK - 13b, версия FFmpeg - 3.0.12
0 ответов
Я также обнаружил, что оболочка - это самый простой способ приблизиться к ffmpeg на Android - аналогично тому подходу, который вы используете.
Мне удалось создать и запустить оболочку ffmpeg, но по пути обнаружил немало проблем и нацелился только на конкретную архитектуру системы, над которой я работал в то время.
Если бы я делал это снова (или даже если бы мне пришлось сделать это через 5 минут после того, как я закончил изначально...), я бы определенно использовал хорошо поддерживаемую и широко используемую оболочку с открытым исходным кодом. Два из самых популярных:
- https://github.com/WritingMinds/ffmpeg-android-java (для Android)
- https://github.com/tanersener/mobile-ffmpeg (iOS и Android)
Обычно они уже решают проблемы, которые вам придется найти и исправить самостоятельно, а также могут поддерживать несколько системных архитектур.