如何在android中以编程方式执行命令行ffmpeg命令?

如何在android中以编程方式执行命令行ffmpeg命令?,android,android-ndk,ffmpeg,media,codec,Android,Android Ndk,Ffmpeg,Media,Codec,我已经使用 . 现在我必须构建一个示例转换器应用程序,如mp4到3gp。我知道有命令行命令ffmpeg-I video\u origine.avi video\u finale.mpg。但我不知道如何通过编程执行这些命令。我有这样的示例代码 jint Java_com_example_ndklearning1_MainActivity_logFileInfo(JNIEnv * env, jobject this, jstring filename) { av_register_all()

我已经使用 . 现在我必须构建一个示例转换器应用程序,如mp4到3gp。我知道有命令行命令
ffmpeg-I video\u origine.avi video\u finale.mpg
。但我不知道如何通过编程执行这些命令。我有这样的示例代码

jint Java_com_example_ndklearning1_MainActivity_logFileInfo(JNIEnv * env, jobject this, jstring filename)
{
    av_register_all();

    AVFormatContext *pFormatCtx;
    const jbyte *str;
    str = (*env)->GetStringUTFChars(env, filename, NULL);

    if(av_open_input_file(&pFormatCtx, str, NULL, 0, NULL)!=0)
    {
        LOGE("Can't open file '%s'\n", str);
        return 1;
    }
    else
    {
        LOGI("File was opened\n");
        LOGI("File '%s', Codec %s",
            pFormatCtx->filename,
            pFormatCtx->iformat->name
        );

    }
    return 0;
}
这段代码打开一个文件并提取编解码器信息。我想要的只是,将打开的文件转换为所需的格式。任何类型的帮助,如代码片段或后续步骤,将不胜感激


ffmpeg API能满足我的需求吗?如果有可用的现有API,它将更有帮助

最近我遇到了类似的问题。我的解决方案是在Java程序中模拟命令行

首先,我在文件“ffmpeg.c”中添加了一个函数:

希望这有帮助

编辑: Android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_WHOLE_STATIC_LIBRARIES := libavformat libavcodec libavutil libpostproc libswscale libswresample libavfilter
LOCAL_MODULE    := VideoUtilLib
LOCAL_SRC_FILES := NativeVideoUtil.c ffmpeg.c ffmpeg_opt.c cmdutils.c ffmpeg_filter.c
LOCAL_LDLIBS := -lz -llog
include $(BUILD_SHARED_LIBRARY)
include $(call all-makefiles-under,$(LOCAL_PATH))

用本机文件替换NativeVideoUtil.c。

!我会试试你的方法!我不在办公室,所以我得等到明天早上。同时,你能告诉我,在做了修改之后,我是否需要为android重建ffmpeg?我是否需要在我的本机代码文件中包含任何头文件?您需要包含的头文件只是和。我将在我的答案中发布我的Android.mk。我收到以下错误:08-14 05:30:11.729:W/dalvikvm(17973):PR_CAPBSET_DROP 0失败:参数无效。请确保编译内核时启用了文件功能支持。我直接用ffmpeg源代码编译了我的android项目。所以我没有遇到这个问题。也许你可以尝试用ffmpeg源代码编译。请给我们你编译过的ffmpeg源代码好吗?
extern const char* cmd_simulation(int, const char**);

JNIEXPORT int JNICALL Java_com_test_videowatermark_VideoUtil_test(JNIEnv * env, jobject object, jobjectArray strArray);



JNIEXPORT int JNICALL Java_com_test_videowatermark_VideoUtil_test(JNIEnv * env, jobject object, jobjectArray strArray)
{
    int arrayLength = (*env)->GetArrayLength(env, strArray);
    const char* args[arrayLength];

    int i;
    for(i = 0; i < arrayLength; i++){
        jstring jstr = (jstring)((*env)->GetObjectArrayElement(env, strArray, i));
        args[i] = (*env)->GetStringUTFChars(env, jstr, 0);
        //strcpy(args[i], arg);
        //env->ReleaseStringUTFChars(jstr, arg);
    }


    const char** argv = args;
    return  cmd_simulation(arrayLength, argv);  

}
private void executeCommand(){
    String[] command = {"ffmpeg", "-i", "some video file name",};
    int result = test(command);     
}
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_WHOLE_STATIC_LIBRARIES := libavformat libavcodec libavutil libpostproc libswscale libswresample libavfilter
LOCAL_MODULE    := VideoUtilLib
LOCAL_SRC_FILES := NativeVideoUtil.c ffmpeg.c ffmpeg_opt.c cmdutils.c ffmpeg_filter.c
LOCAL_LDLIBS := -lz -llog
include $(BUILD_SHARED_LIBRARY)
include $(call all-makefiles-under,$(LOCAL_PATH))