Trying to use FFMPEG for android. Compiling but st

2019-05-14 02:41发布

问题:

So to start off... Im trying to use ffmpeg to compile an array of images into a video on Android.

I have followed a variety of tutorials online and have gotten as far as being able to compile the lib for Android and still have to project run. The repo im now using can be found here: https://github.com/Batterii/android-ffmpeg-x264

I made a couple tweaks to the setttings.sh just to correct ndk location. Besides that, I followed the instructions and it seemed to work flawlessly.

After that, I converted the "Project" project into an Android stdio library module.

I am not getting any compile errors, nor am I getting any runtime errors, or any other errors that I can detect... Nothing on logcat... But I am definitely not getting any video called out.mp4. In an onCreate of a particular activity, I am running this code:

Videokit vk = new Videokit();
vk.run(new String[]{"ffmpeg", "-r", "1/5", "-i", "%d.jpg", "-c:v", "libx264", "-r", "30", "-pix_fmt", "yuv420p", project.getProjectDirectory() + "/out.mp4"});

This command is taken from the command line example found here: https://trac.ffmpeg.org/wiki/Create%20a%20video%20slideshow%20from%20images

Thank you in advance for anyone taking the time to look through this post... I am pretty baffled at this point, as there are no errors I can find and no video... Thanks

======================================================================

Update

Turns out it is not actually compiling correctly... but i have found a few things. here is the make file from the Eclipse version of the project

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE  := videokit
# These need to be in the right order
FFMPEG_LIBS := $(addprefix ffmpeg/, \
 libavdevice/libavdevice.a \
 libavformat/libavformat.a \
 libavfilter/libavfilter.a \
 libavcodec/libavcodec.a \
 libswscale/libswscale.a \
 libavutil/libavutil.a \
 libswresample/libswresample.a \
 libpostproc/libpostproc.a )
# ffmpeg uses its own deprecated functions liberally, so turn off that annoying noise
LOCAL_CFLAGS += -g -Iffmpeg -Ivideokit -Wno-deprecated-declarations 
LOCAL_LDLIBS += -llog -lz $(FFMPEG_LIBS) x264/libx264.a
LOCAL_SRC_FILES :=  ffmpeg/cmdutils.c ffmpeg/ffmpeg.c videokit/uk_co_halfninja_videokit_Videokit.c
include $(BUILD_SHARED_LIBRARY)

and here is the make file that gradle is auto-generating for me... thanks to Android Studio...

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE := videokit
LOCAL_CFLAGS := -g -Isrc/main/jni/ffmpeg -Isrc/main/jni/videokit -Wno-deprecated-declarations
LOCAL_LDLIBS := \
    -lffmpeg/libavformat/libavformat.a \
    -lffmpeg/libavcodec/libavcodec.a \
    -lffmpeg/libswresample/libswresample.a \
    -lffmpeg/libavfilter/libavfilter.a \
    -lffmpeg/libpostproc/libpostproc.a \
    -lffmpeg/libavdevice/libavdevice.a \
    -lx264/libx264.a \
    -lffmpeg/libavutil/libavutil.a \
    -llog \
    -lz \
    -lffmpeg/libswscale/libswscale.a \

LOCAL_SRC_FILES := \
    Project/Module/src/main/jni/ffmpeg/cmdutils.c \
    Project/Module/src/main/jni/ffmpeg/ffmpeg.c \
    Project/Module/src/main/jni/videokit/com_t10_project_util_FfmpegHelper.c \

LOCAL_C_INCLUDES += Project/Module/src/main/jni/ffmpeg/cmdutils.c
LOCAL_C_INCLUDES += Project/Module/src/main/jni/ffmpeg/ffmpeg.c
LOCAL_C_INCLUDES += Project/Module/src/main/jni/videokit/com_t10_project_util_FfmpegHelper.c
LOCAL_C_INCLUDES += Project/Module/src/arm/jni
LOCAL_C_INCLUDES += Project/Module/src/debug/jni
LOCAL_C_INCLUDES += Project/Module/src/armDebug/jni

include $(BUILD_SHARED_LIBRARY)

And finally, here is my build.gradle

apply plugin: 'android'

android {
    compileSdkVersion 19
    buildToolsVersion '19.0.1'

    defaultConfig {
        minSdkVersion 14
        targetSdkVersion 19
        versionCode 1
        versionName "1.0"

        ndk {
            moduleName "videokit"
            stl "stlport_shared"
            ldLibs "log", "z",
                    "ffmpeg/libavdevice/libavdevice.a",
                    "ffmpeg/libavformat/libavformat.a",
                    "ffmpeg/libavfilter/libavfilter.a",
                    "ffmpeg/libavcodec/libavcodec.a",
                    "ffmpeg/libswscale/libswscale.a",
                    "ffmpeg/libavutil/libavutil.a",
                    "ffmpeg/libswresample/libswresample.a",


              "ffmpeg/libpostproc/libpostproc.a",
                "x264/libx264.a"
            cFlags "-g -Isrc/main/jni/ffmpeg -Isrc/main/jni/videokit -Wno-deprecated-declarations"

        }
    }

    sourceSets.main {
        jniLibs.srcDir 'src/main/libs'
        jni.srcDirs = ['src/main/jni/ffmpeg/cmdutils.c',
                       'src/main/jni/ffmpeg/ffmpeg.c',
                       'src/main/jni/videokit/com_t10_project_util_FfmpegHelper.c']
    }

    productFlavors {
        x86 {
            versionCode Integer.parseInt("6" + defaultConfig.versionCode)
            ndk {
                abiFilter "x86"
            }
        }
        mips {
            versionCode Integer.parseInt("4" + defaultConfig.versionCode)
            ndk {
                abiFilter "mips"
            }
        }
        armv7 {
            versionCode Integer.parseInt("2" + defaultConfig.versionCode)
            ndk {
                abiFilter "armeabi-v7a"
            }
        }
        arm {
            versionCode Integer.parseInt("1" + defaultConfig.versionCode)
            ndk {
                abiFilter "armeabi"
            }
        }
        fat
    }

    buildTypes {
        release {
            runProguard false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        }
    }
}

dependencies {
    compile 'com.android.support:support-v4:19.0.0'
    compile fileTree(dir: 'libs', include: ['*.jar', '*.aar'])
}

As you can see, my build.gradle generates something that is pretty close to the original... but not the same. When i try to run/compile it, gradle spits this out

Executing tasks: [:Project:assembleArmDebug]

:Project:compileArmDebugNdkcc1: warning: Project/Module/src/main/jni/ffmpeg/cmdutils.c: not a directory [enabled by default]
cc1: warning: Project/Module/src/main/jni/ffmpeg/ffmpeg.c: not a directory [enabled by default]
cc1: warning: Project/Module/src/main/jni/videokit/com_t10_project_util_FfmpegHelper.c: not a directory [enabled by default]
In file included from Project/Module/src/main/jni/ffmpeg/cmdutils.c:32:0:
Project/Module/src/main/jni/ffmpeg/libavformat/avformat.h:82:32: fatal error: libavcodec/avcodec.h: No such file or directory
compilation terminated.
make: *** [Project/Module/build/ndk/arm/debug/obj/local/armeabi/objs/videokit/Project/Module/src/main/jni/ffmpeg/cmdutils.o] Error 1
 FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':Project:compileArmDebugNdk'.
> com.android.ide.common.internal.LoggedErrorException: Failed to run command:
    android-ndk-r9d/ndk-build NDK_PROJECT_PATH=null APP_BUILD_SCRIPT=Project/Module/build/ndk/arm/debug/Android.mk APP_PLATFORM=android-19 NDK_OUT=Project/Module/build/ndk/arm/debug/obj NDK_LIBS_OUT=Project/Module/build/ndk/arm/debug/lib APP_STL=stlport_shared APP_ABI=armeabi
  Error Code:
    2
  Output:
    cc1: warning: Project/Module/src/main/jni/ffmpeg/cmdutils.c: not a directory [enabled by default]
    cc1: warning: Project/Module/src/main/jni/ffmpeg/ffmpeg.c: not a directory [enabled by default]
    cc1: warning: Project/Module/src/main/jni/videokit/com_t10_project_util_FfmpegHelper.c: not a directory [enabled by default]
    In file included from Project/Module/src/main/jni/ffmpeg/cmdutils.c:32:0:
    Project/Module/src/main/jni/ffmpeg/libavformat/avformat.h:82:32: fatal error: libavcodec/avcodec.h: No such file or directory
    compilation terminated.
    make: *** [Project/Module/build/ndk/arm/debug/obj/local/armeabi/objs/videokit/Project/Module/src/main/jni/ffmpeg/cmdutils.o] Error 1


* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED

Total time: 8.184 secs

I've been messing around with it for a couple hours now and pretty much every time, i get gradle yelling at me about the fact that it can't find some file. I'm beginning to think that maybe it is because my LOCAL_LDLIBS aren't in the same order as the original...? Im not entirely sure... Does anyone else have any ideas...?