Обертка FFmpeg для Android - PullRequest
       32

Обертка FFmpeg для Android

0 голосов
/ 23 февраля 2019

Мне удалось скомпилировать ffmpeg и получить .so файлы для различных арок, таких как amreabi, armeabi-v7a и т. Д.

Мне удалось интегрировать эти готовые библиотеки в мой проект Android с помощью CMakeLists.txt через собственную .cpp оболочку.Проблема в том, что у меня нет навыков в C ++.Таким образом, другой способ использования ffmpeg состоит в том, чтобы вызвать функцию main() из ffmpeg.c. Эта ссылка описывает шаги, как это сделать.

В моем проекте:

структура

Structure

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

...