-- 之ffmpeg命令行参数解析
大家通过git在安装好cygwin之后,下载源码到(cygwin)home目录,通过./configure ...... ,可以添加一堆参数选项,执行可以生成config.mk等编译使用的文件,通过命令对工程编译进行配置可以达到一些裁剪功能,去掉不需要的部分。然后make之后会生成fserver.exe ,ffmpeg.exe , ffprobe.exe , ffplayer.exe几个可以供用户使用的工具。
ffmpeg是一个命令行工具,主要将一个多媒体文件不同格式之间进行转换;ffserver是一个多媒体流服务器,主要用于实时广播;ffplay是一个小型的每天播放器,基于SDL和ffmpeg库生成;最后ffprobe是一个简单的流分析仪。
另外这些工具都支持哪些命令参数,怎么使用,这个网上搜索很方便。但是要整体搜集的话,有很好的方法。如:ffserver -help 就可以全部打印出来
int main(int argc, char **argv)
{
int ret;
int64_t ti;
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();
show_banner(argc, argv, options);
term_init();
/* 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);
// }
current_time = ti = getutime();
if (transcode() < 0)
exit_program(1);
ti = getutime() - ti;
if (do_benchmark) {
printf("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 : 0);
return 0;
}