使用FFmpeg 4.0.2并两次调用其ffmpeg.c的主要功能会导致Android应用崩溃(使用FFmpeg共享库和JNI)
A/libc: Fatal signal 11 (SIGSEGV), code 1, fault addr 0x0 in tID 20153
虽然对于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;}
FFmpeg 3.2.5主要
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;}
那么可能是什么问题?似乎FFmpeg 4.0.2不会释放任何内容(在第一个命令后,资源或其静态变量为初始值)
解决方法:
将FFmpeg 3.2.5的下一行添加到FFmpeg 4.0.2的主要功能末尾解决了该问题(我将FFmpeg 3.2.5下载为某人的AndroID项目,以便用户添加了这些行)
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;
总结 以上是内存溢出为你收集整理的两次调用ffmpeg.c的主程序导致应用崩溃全部内容,希望文章能够帮你解决两次调用ffmpeg.c的主程序导致应用崩溃所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)