想要一个输出的可指定文件路径的文件,文件的内容是ffmpeg运行过程中自己想获取的信息。
步骤1-定义这个命令行选项:
找到ffmpeg_opt.c中
“
enum OptGroup {
GROUP_OUTFILE,
GROUP_INFILE,
};
static const OptionGroupDef groups[] = {
[GROUP_OUTFILE] = { "output url", NULL, OPT_OUTPUT },
[GROUP_INFILE] = { "input url", "i", OPT_INPUT },
};
”
加入一个新的enum选项,比如说GROUP_FEATUREFILE,然后它的命令行提示符比如说我们选定"-feature",
那么就修改上面的代码为
“
enum OptGroup {
GROUP_OUTFILE,
GROUP_INFILE,
GROUP_FEATUREFILE,
};
static const OptionGroupDef groups[] = {
[GROUP_OUTFILE] = { "output url", NULL, OPT_OUTPUT },
[GROUP_INFILE] = { "input url", "i", OPT_INPUT },
[GROUP_FEATUREFILE] = {"feature url", "feature", OPT_FEATURE},
};
”
然后我们在ffmpeg/cmdutils.h定义一个#define OPT_FEATURE 0x100000(只要是没有被选过的都可以)。
步骤2-增加处理这个新命令行参数的方法:
在ffmpeg_opt.c的static int open_files(OptionGroupList *l, const char *inout,
int (*open_file)(OptionsContext*, const char*))的
for (i = 0; i < l->nb_groups; i++) {
OptionGroup *g = &l->groups[i];
OptionsContext o;
加入代码段(A)处理"-feature“
init_options(&o);...}
代码段(A)为:
if (g->group_def->sep && !strcmp("feature", g->group_def->sep)) {
ret = open_file(&o, g->arg);
if (ret == 1) {
av_log(NULL, AV_LOG_ERROR, "Error opening %s file %s.\n",
inout, g->arg);
return ret;
}
else if (ret == 0) {
av_log(NULL, AV_LOG_DEBUG, "Successfully opened the file.\n");
return ret;
}
else {
av_log(NULL, AV_LOG_ERROR, "Error opening %s file %s.\n",
inout, g->arg);
return ret;
}
}
步骤3-增加基于命令参数的功能
在ffmpeg_opt.c定义一个static int open_feature_file(OptionsContext *o, const char *filename)
这个*o里面是一些初始化参数,其实如果写得糙一点是用不到的哈哈哈,但是还是先留着了万一以后要用。
我们实现一个最简单的功能,就是通过这个参数打开一个全局文件指针。
static int open_feature_file(OptionsContext *o, const char *filename)
{
FILE * feature_out = fopen(filename, "a+");
if (NULL == feature_out)
{
printf("open file error");
return 1;
}
}
在ffmpeg/cmdutils.h里定义一个“extern FILE * feature_out;”,这样引用了ffmpeg/cmdutils.h的文件就都对这一自定义输出文件可见了
就完成了。