3

まず始めに... Android上でffmpegを使用して一連の画像をビデオにコンパイルしようとしています。

私はオンラインで様々なチュートリアルをたどり、Android用のlibをコンパイルすることができ、それでもプロジェクトを実行する必要があるということになりました。 現在使用しているレポジトリはここにあります。https://github.com/Batterii/android-ffmpeg-x264

私はちょうどndkの位置を修正するためにsetttings.shにいくつかの調整を加えました。それに加えて、私は指示に従った、それは完璧に動作するようだった。

その後、私は "Project"プロジェクトをAndroidのstdioライブラリモジュールに変換しました。Screenshot of android studio module



コンパイルエラーも、ランタイムエラーも、検出できるその他のエラーも発生していません... logcatには何もありません...しかし、out.mp4という名前のビデオは絶対にありません。 特定のアクティビティの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"});

このコマンドは、次のコマンドラインの例から引用しています。https://trac.ffmpeg.org/wiki/Create%20a%20video%20slideshow%20from%20images

この記事を見ていく時間を割いてくれてありがとうございます...私は見つけることができるエラーもビデオもないので、私はこの時点でかなり困惑しています... ありがとう

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

更新

実際には正しくコンパイルされていないことがわかりました...しかし、私はいくつかのことを発見しました。 これが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ファイルがあります... 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)

そして最後に、これが私の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'])
}

お分かりのように、私の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

私は2、3時間ずっとそれをいじっていました、そして、ほとんど毎回、私はそれがいくつかのファイルを見つけることができないという事実について私に怒鳴りつけます。私のLOCAL_LDLIBSが元の順番と同じではないためかもしれません。完全に確信が持てません…他に誰かが何かアイデアを持っていますか…?


  • project.getProjectDirectory() - まずはじめにそれを取り除き、" / sdcard /"にハードコードするだけです。問題なく動作することがわかります。次に、マニフェストでWRITE_EXTERNAL_STORAGE権限を持っていることを確認してください。また、プロジェクト内のffmpeg.cファイルを見て、関数av_log()を使用している場所を検索し、LOGI()への呼び出しを追加して同様のメッセージを記録することをお勧めします。それはあなたにlogcatへのより多くの出力を与えてあなたがあなたの問題を見つけるのを助けるかもしれません。 - themightyjon
  • project.getProjectDirectory()は、現在の'プロジェクトのディレクトリを取得するだけです。私はこれで画像を正しく保存しているので、私はこれがすでにうまくいくことを知っています。 av_logとLOGIに関しては、それらを追加して、それ以上情報が得られるかどうかを確認します。 - Austin Mueller
  • ファイルをディレクトリとして指定している(jni.srcDirsにあります)という3つの警告が表示され、ffmpegヘッダーファイルがインクルードパス上にないように思われるので、おそらくパスが表示されます。与えられたものはあなたが彼らがいると思う場所に相対的ではありません。あなたは、生成されたメークファイルの中で、さまざまな場所に関連したパスを持っていると思われるかもしれません。 - themightyjon
  • "プロジェクト/モジュール/"を試してください。インクルードパスの前にビットを入れるか、今のところ絶対パスを指定してそれが機能するかどうかを確認してください。 " - info"を使ってgradleを実行できることを忘れないでください。または「 - debug」または何が起こっているのかについてのより多くの情報を得るためにコマンドラインから、そしてあなたはそれを冗長にするためにjniディレクトリから、生成されたmakefileに対してV = 1でndk-buildを実行することができます。 - themightyjon

リンクされた質問


関連する質問

最近の質問