Обертка 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 минут после того, как я закончил изначально...), я бы определенно использовал хорошо поддерживаемую и широко используемую оболочку с открытым исходным кодом. Два из самых популярных:

Обычно они уже решают проблемы, которые вам придется найти и исправить самостоятельно, а также могут поддерживать несколько системных архитектур.

Другие вопросы по тегам