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

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

概述我已经使用bambuser为android成功构建了ffmpeg.现在我必须建立一个像mp4到3gp的样本转换器应用程序.我知道有命令行命令ffmpeg-ivideo_origine.avivideo_finale.mpg.但我不知道如何以编程方式执行这些命令.我有示例代码jintJava_com_example_ndklearning1_MainActivity_logF

我已经使用bambuser为androID成功构建了ffmpeg
.现在我必须建立一个像mp4到3gp的样本转换器应用程序.我知道有命令行命令ffmpeg -i vIDeo_origine.avi vIDeo_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”中添加一个函数:

int cmd_simulation(int argc, const char** argv){OptionsContext o = { 0 };// int64_t ti;reset_options(&o, 0);av_log_set_flags(AV_LOG_SKIP_REPEATED);parse_loglevel(argc, argv, options);if(argc>1 && !strcmp(argv[1], "-d")){    run_as_daemon=1;    av_log_set_callback(log_callback_null);    argc--;    argv++;}avcodec_register_all();avfilter_register_all();av_register_all();avformat_network_init();//show_banner(argc, argv, options);term_init();parse_cpuflags(argc, argv, options);/* parse options */parse_options(&o, argc, argv, options, opt_output_file);if (nb_output_files <= 0 && nb_input_files == 0) {    show_usage();    av_log(NulL, AV_LOG_WARNING, "Use -h to get full help or, even better, run 'man %s'\n", program_name);    exit_program(1);}if (nb_output_files <= 0) {    av_log(NulL, AV_LOG_FATAL, "At least one output file must be specifIEd\n");    exit_program(1);}if (transcode() < 0)    exit_program(1);//exit_program(0);return 7;}

事实上,这个函数只是主要功能的一个副本,只需稍加修改即可.

然后创建一个本机函数:

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);  }

使用ffmpeg编译后,您可以模拟excuting ffmpeg命令,如:

private voID executeCommand(){    String[] command = {"ffmpeg", "-i", "some vIDeo file name",};    int result = test(command);     }

希望这可以帮助!

编辑:
AndroID.mk

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_WHolE_STATIC_liBRARIES := libavformat libavcodec libavutil libpostproc libswscale libswresample libavfilterLOCAL_MODulE    := VIDeoUtillibLOCAL_SRC_fileS := NativeVIDeoUtil.c ffmpeg.c ffmpeg_opt.c cmdutils.c ffmpeg_filter.cLOCAL_LDliBS := -lz -lloginclude $(BUILD_SHARED_liBRARY)include $(call all-makefiles-under,$(LOCAL_PATH))

将NativeVIDeoUtil.c替换为您的本机文件.

总结

以上是内存溢出为你收集整理的如何在android中以编程方式执行命令行ffmpeg命令?全部内容,希望文章能够帮你解决如何在android中以编程方式执行命令行ffmpeg命令?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1117807.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-29
下一篇 2022-05-29

发表评论

登录后才能评论

评论列表(0条)

保存