3

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. Screenshot of android studio 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...?


  • project.getProjectDirectory() - for a start what is that? Get rid of it and just hardcode in "/sdcard/" instead until you know it's working. Then make sure you've got the WRITE_EXTERNAL_STORAGE permission in the manifest. Also, I'd suggest if you look at the ffmpeg.c file in your project, search for places where it uses the function av_log(), and add a call to LOGI() to log a similar message. That might get you more output to logcat and help you find your problem. - themightyjon
  • project.getProjectDirectory() simply gets the dir for the current 'project' i know this works already as i am storing images correctly with this. As for the av_log and LOGI i will add those and see if i can gain any more information. - Austin Mueller
  • I see 3 warnings that you've specified files as directories (you have, at jni.srcDirs), and your ffmpeg header files are don't seem to be on the include path, so perhaps the paths you've given are not relative to where you think they are. Seems likely given that you've got paths in that generated makefile relative to different places. - themightyjon
  • Try with the "Project/Module/" bit on the front of your include paths, or try specifying them absolute for now and see if that works. Don't forget you can run gradle with "--info" or "--debug" from the command line to get more information about what's happening, and that you can run ndk-build with V=1 on the generated makefile, from the jni directory, to make that verbose. - themightyjon

Linked


Related

Latest