Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
正在尝试为android使用FFMPEG。正在编译但仍不工作_Android_Android Ndk_Ffmpeg_Gradle - Fatal编程技术网

正在尝试为android使用FFMPEG。正在编译但仍不工作

正在尝试为android使用FFMPEG。正在编译但仍不工作,android,android-ndk,ffmpeg,gradle,Android,Android Ndk,Ffmpeg,Gradle,所以首先。。。我试图在Android上使用ffmpeg将一系列图像编译成视频 我在网上学习了各种教程,已经能够为Android编译lib了,但仍然需要运行项目。 我现在使用的回购协议可在此处找到: 我对setttings.sh做了一些调整,只是为了纠正ndk的位置。除此之外,我按照指示操作,它似乎工作得完美无缺 之后,我将“Project”项目转换为一个Android stdio库模块。 我没有收到任何编译错误,也没有收到任何运行时错误,或任何其他我可以检测到的错误。。。logcat上没有任何内

所以首先。。。我试图在Android上使用ffmpeg将一系列图像编译成视频

我在网上学习了各种教程,已经能够为Android编译lib了,但仍然需要运行项目。 我现在使用的回购协议可在此处找到:

我对setttings.sh做了一些调整,只是为了纠正ndk的位置。除此之外,我按照指示操作,它似乎工作得完美无缺

之后,我将“Project”项目转换为一个Android stdio库模块。

我没有收到任何编译错误,也没有收到任何运行时错误,或任何其他我可以检测到的错误。。。logcat上没有任何内容。。。但我绝对不会收到任何视频。 在特定活动的onCreate中,我运行以下代码:

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"});
此命令取自以下命令行示例:

提前感谢您抽出时间浏览本帖。。。在这一点上我很困惑,因为我找不到错误,也没有视频。。。 谢谢

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

更新 事实证明它实际上并没有正确编译。。。但我发现了一些东西。 下面是来自项目Eclipse版本的make文件

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)
这是gradle为我自动生成的make文件。。。感谢安卓工作室

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)
最后,这是我的身材

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'])
}
如您所见,my build.gradle生成的内容与原始版本非常接近。。。但不一样。当我试着运行/编译它时,gradle说出了这一点

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

我已经在这乱搞了几个小时了,几乎每一次,我都会让gradle对我大喊大叫,说它找不到文件。我开始想,可能是因为我的本地文件与原始文件的顺序不一样。。。?我不完全确定。。。其他人有什么想法吗…?

project.getProjectDirectory()-首先,这是什么?去掉它,只需在“/sdcard/”中硬编码,直到您知道它起作用为止。然后确保您在清单中拥有写入外部存储权限。另外,我建议您查看项目中的ffmpeg.c文件,搜索它使用函数av_log()的位置,并添加对LOGI()的调用以记录类似的消息。这可能会使您获得更多到logcat的输出,并帮助您找到问题。project.getProjectDirectory()只需获取当前“项目”的目录,我知道这已经起作用了,因为我正在使用它正确存储图像。至于av_日志和LOGI,我将添加它们,看看是否可以获得更多信息。我看到3条警告,您已将文件指定为目录(您在jni.srcDirs上有),并且您的ffmpeg头文件似乎不在包含路径上,因此,您给出的路径可能与您认为的路径不相关。很可能是因为生成的makefile中有相对于不同位置的路径。请尝试使用包含路径前面的“Project/Module/”位,或者尝试暂时将它们指定为绝对路径,看看是否有效。不要忘记,您可以从命令行运行带有“-info”或“-debug”的gradle,以获得有关正在发生的事情的更多信息,并且可以从jni目录对生成的makefile运行带有V=1的ndk build,以使其更详细。