Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/226.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.c';s main两次导致应用程序崩溃_Android_Ffmpeg - Fatal编程技术网

Android 调用ffmpeg.c';s main两次导致应用程序崩溃

Android 调用ffmpeg.c';s main两次导致应用程序崩溃,android,ffmpeg,Android,Ffmpeg,使用FFmpeg 4.0.2并两次调用其FFmpeg.c的main函数会导致Android应用程序崩溃(使用FFmpeg共享库和JNI) 尽管它在FFmpeg 3.2.5中工作正常 FFmpeg 4.0.2主版本 int main(int argc, char **argv) { int i, ret; int64_t ti; init_dynload(); register_exit(ffmpeg_cleanup); setvbuf(stderr,

使用FFmpeg 4.0.2并两次调用其
FFmpeg.c的main
函数会导致Android应用程序崩溃(使用FFmpeg共享库和JNI)

尽管它在FFmpeg 3.2.5中工作正常

FFmpeg 4.0.2主版本

int main(int argc, char **argv) {
    int i, ret;
    int64_t ti;

    init_dynload();

    register_exit(ffmpeg_cleanup);

    setvbuf(stderr,NULL,_IONBF,0); /* win32 runtime needs this */

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

#if CONFIG_AVDEVICE
    avdevice_register_all();
#endif
    avformat_network_init();

    show_banner(argc, argv, options);

    /* parse options and open all input/output files */
    ret = ffmpeg_parse_options(argc, argv);
    if (ret < 0)
        exit_program(1);

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

    /* file converter / grab */
    if (nb_output_files <= 0) {
        av_log(NULL, AV_LOG_FATAL, "At least one output file must be specified\n");
        exit_program(1);
    }

//     if (nb_input_files == 0) {
//         av_log(NULL, AV_LOG_FATAL, "At least one input file must be specified\n");
//         exit_program(1);
//     }

    for (i = 0; i < nb_output_files; i++) {
        if (strcmp(output_files[i]->ctx->oformat->name, "rtp"))
            want_sdp = 0;
    }

    current_time = ti = getutime();
    if (transcode() < 0)
        exit_program(1);
    ti = getutime() - ti;
    if (do_benchmark) {
        av_log(NULL, AV_LOG_INFO, "bench: utime=%0.3fs\n", ti / 1000000.0);
    }
    av_log(NULL, AV_LOG_DEBUG, "%"PRIu64" frames successfully decoded, %"PRIu64" decoding errors\n",
           decode_error_stat[0], decode_error_stat[1]);
    if ((decode_error_stat[0] + decode_error_stat[1]) * max_error_rate < decode_error_stat[1])
        exit_program(69);

    ffmpeg_cleanup(received_nb_signals ? 255 : main_return_code);
    return main_return_code;
}
int main(int argc, char **argv) {
    av_log(NULL, AV_LOG_WARNING, " Command start");

    int i, ret;
    int64_t ti;
    init_dynload();

    register_exit(ffmpeg_cleanup);

    setvbuf(stderr, NULL, _IONBF, 0); /* win32 runtime needs this */

    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();
#if CONFIG_AVDEVICE
    avdevice_register_all();
#endif
    avfilter_register_all();
    av_register_all();
    avformat_network_init();

    av_log(NULL, AV_LOG_WARNING, " Register to complete the codec");

    show_banner(argc, argv, options);

    /* parse options and open all input/output files */
    ret = ffmpeg_parse_options(argc, argv);
    if (ret < 0)
        exit_program(1);

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

    /* file converter / grab */
    if (nb_output_files <= 0) {
        av_log(NULL, AV_LOG_FATAL, "At least one output file must be specified\n");
        exit_program(1);
    }

//     if (nb_input_files == 0) {
//         av_log(NULL, AV_LOG_FATAL, "At least one input file must be specified\n");
//         exit_program(1);
//     }

    for (i = 0; i < nb_output_files; i++) {
        if (strcmp(output_files[i]->ctx->oformat->name, "rtp"))
            want_sdp = 0;
    }

    current_time = ti = getutime();
    if (transcode() < 0)
        exit_program(1);
    ti = getutime() - ti;
    if (do_benchmark) {
        av_log(NULL, AV_LOG_INFO, "bench: utime=%0.3fs\n", ti / 1000000.0);
    }
    av_log(NULL, AV_LOG_DEBUG, "%"PRIu64" frames successfully decoded, %"PRIu64" decoding errors\n",
           decode_error_stat[0], decode_error_stat[1]);
    if ((decode_error_stat[0] + decode_error_stat[1]) * max_error_rate < decode_error_stat[1])
        exit_program(69);

    exit_program(received_nb_signals ? 255 : main_return_code);

    nb_filtergraphs = 0;
    nb_input_streams = 0;
    nb_input_files = 0;
    progress_avio = NULL;


    input_streams = NULL;
    nb_input_streams = 0;
    input_files = NULL;
    nb_input_files = 0;

    output_streams = NULL;
    nb_output_streams = 0;
    output_files = NULL;
    nb_output_files = 0;

    return main_return_code;
}
int main(int argc,char**argv){
int i,ret;
国际贸易组织;
init_dynload();
寄存器退出(ffmpeg\U清除);
setvbuf(stderr,NULL,_IONBF,0);/*win32运行时需要此*/
av_日志_设置_标志(av_日志_跳过_重复);
解析日志级别(argc、argv、选项);
如果(argc>1&&!strcmp(argv[1],“-d”)){
运行_作为_守护进程=1;
av_log_set_callback(log_callback_null);
argc--;
argv++;
}
#如果配置AVU设备
avdevice_register_all();
#恩迪夫
avformat_network_init();
显示_横幅(argc、argv、选项);
/*解析选项并打开所有输入/输出文件*/
ret=ffmpeg_解析_选项(argc、argv);
如果(ret<0)
退出程序(1);
if(格式->名称的nb_输出_文件,“rtp”))
want_sdp=0;
}
当前时间=ti=getutime();
if(转码()<0)
退出程序(1);
ti=getutime()-ti;
if(do_基准){
av_日志(空,av_日志信息,“工作台:utime=%0.3fs\n”,ti/1000000.0);
}
av_日志(空,av_日志调试,“%”PRIu64“帧成功解码,%”PRIu64“解码错误\n”,
解码错误统计[0],解码错误统计[1];
如果((解码错误统计[0]+解码错误统计[1])*最大错误率<解码错误统计[1])
退出计划(69);
ffmpeg_清除(接收到的_nb_信号?255:主_返回_代码);
返回主\u返回\u代码;
}
FFmpeg 3.2.5主版本

int main(int argc, char **argv) {
    int i, ret;
    int64_t ti;

    init_dynload();

    register_exit(ffmpeg_cleanup);

    setvbuf(stderr,NULL,_IONBF,0); /* win32 runtime needs this */

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

#if CONFIG_AVDEVICE
    avdevice_register_all();
#endif
    avformat_network_init();

    show_banner(argc, argv, options);

    /* parse options and open all input/output files */
    ret = ffmpeg_parse_options(argc, argv);
    if (ret < 0)
        exit_program(1);

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

    /* file converter / grab */
    if (nb_output_files <= 0) {
        av_log(NULL, AV_LOG_FATAL, "At least one output file must be specified\n");
        exit_program(1);
    }

//     if (nb_input_files == 0) {
//         av_log(NULL, AV_LOG_FATAL, "At least one input file must be specified\n");
//         exit_program(1);
//     }

    for (i = 0; i < nb_output_files; i++) {
        if (strcmp(output_files[i]->ctx->oformat->name, "rtp"))
            want_sdp = 0;
    }

    current_time = ti = getutime();
    if (transcode() < 0)
        exit_program(1);
    ti = getutime() - ti;
    if (do_benchmark) {
        av_log(NULL, AV_LOG_INFO, "bench: utime=%0.3fs\n", ti / 1000000.0);
    }
    av_log(NULL, AV_LOG_DEBUG, "%"PRIu64" frames successfully decoded, %"PRIu64" decoding errors\n",
           decode_error_stat[0], decode_error_stat[1]);
    if ((decode_error_stat[0] + decode_error_stat[1]) * max_error_rate < decode_error_stat[1])
        exit_program(69);

    ffmpeg_cleanup(received_nb_signals ? 255 : main_return_code);
    return main_return_code;
}
int main(int argc, char **argv) {
    av_log(NULL, AV_LOG_WARNING, " Command start");

    int i, ret;
    int64_t ti;
    init_dynload();

    register_exit(ffmpeg_cleanup);

    setvbuf(stderr, NULL, _IONBF, 0); /* win32 runtime needs this */

    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();
#if CONFIG_AVDEVICE
    avdevice_register_all();
#endif
    avfilter_register_all();
    av_register_all();
    avformat_network_init();

    av_log(NULL, AV_LOG_WARNING, " Register to complete the codec");

    show_banner(argc, argv, options);

    /* parse options and open all input/output files */
    ret = ffmpeg_parse_options(argc, argv);
    if (ret < 0)
        exit_program(1);

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

    /* file converter / grab */
    if (nb_output_files <= 0) {
        av_log(NULL, AV_LOG_FATAL, "At least one output file must be specified\n");
        exit_program(1);
    }

//     if (nb_input_files == 0) {
//         av_log(NULL, AV_LOG_FATAL, "At least one input file must be specified\n");
//         exit_program(1);
//     }

    for (i = 0; i < nb_output_files; i++) {
        if (strcmp(output_files[i]->ctx->oformat->name, "rtp"))
            want_sdp = 0;
    }

    current_time = ti = getutime();
    if (transcode() < 0)
        exit_program(1);
    ti = getutime() - ti;
    if (do_benchmark) {
        av_log(NULL, AV_LOG_INFO, "bench: utime=%0.3fs\n", ti / 1000000.0);
    }
    av_log(NULL, AV_LOG_DEBUG, "%"PRIu64" frames successfully decoded, %"PRIu64" decoding errors\n",
           decode_error_stat[0], decode_error_stat[1]);
    if ((decode_error_stat[0] + decode_error_stat[1]) * max_error_rate < decode_error_stat[1])
        exit_program(69);

    exit_program(received_nb_signals ? 255 : main_return_code);

    nb_filtergraphs = 0;
    nb_input_streams = 0;
    nb_input_files = 0;
    progress_avio = NULL;


    input_streams = NULL;
    nb_input_streams = 0;
    input_files = NULL;
    nb_input_files = 0;

    output_streams = NULL;
    nb_output_streams = 0;
    output_files = NULL;
    nb_output_files = 0;

    return main_return_code;
}
int main(int argc,char**argv){
av_日志(空,av_日志警告,“命令启动”);
int i,ret;
国际贸易组织;
init_dynload();
寄存器退出(ffmpeg\U清除);
setvbuf(stderr,NULL,_IONBF,0);/*win32运行时需要此*/
av_日志_设置_标志(av_日志_跳过_重复);
解析日志级别(argc、argv、选项);
如果(argc>1&&!strcmp(argv[1],“-d”)){
运行_作为_守护进程=1;
av_log_set_callback(log_callback_null);
argc--;
argv++;
}
avcodec_寄存器_all();
#如果配置AVU设备
avdevice_register_all();
#恩迪夫
avfilter_register_all();
av_寄存器_all();
avformat_network_init();
av_日志(空,av_日志警告,“注册以完成编解码器”);
显示_横幅(argc、argv、选项);
/*解析选项并打开所有输入/输出文件*/
ret=ffmpeg_解析_选项(argc、argv);
如果(ret<0)
退出程序(1);
if(格式->名称的nb_输出_文件,“rtp”))
want_sdp=0;
}
当前时间=ti=getutime();
if(转码()<0)
退出程序(1);
ti=getutime()-ti;
if(do_基准){
av_日志(空,av_日志信息,“工作台:utime=%0.3fs\n”,ti/1000000.0);
}
av_日志(空,av_日志调试,“%”PRIu64“帧成功解码,%”PRIu64“解码错误\n”,
解码错误统计[0],解码错误统计[1];
如果((解码错误统计[0]+解码错误统计[1])*最大错误率<解码错误统计[1])
退出计划(69);
退出程序(接收到的\u nb\u信号?255:主\u返回\u代码);
nb_filtergraphs=0;
nb_输入_流=0;
nb_输入_文件=0;
进度_avio=NULL;
输入\ u流=空;
nb_输入_流=0;
输入文件=NULL;
nb_输入_文件=0;
输出流=空;
nb_输出_流=0;
输出文件=NULL;
nb_输出_文件=0;
返回主\u返回\u代码;
}

那个么问题可能是什么呢?FFmpeg 4.0.2似乎没有发布任何东西(资源或它的静态变量在第一个命令后变成初始值)

将FFmpeg 3.2.5到FFmpeg 4.0.2的下一行添加到主功能的末尾解决了问题(我下载了FFmpeg 3.2.5作为某人的Android项目,以便用户添加这些行)