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