Мне удалось скомпилировать 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