ffmpeg添加自定义命令行输出文件

本文介绍了如何在ffmpeg中添加新的命令行选项,以便在运行过程中将特定信息输出到指定文件。通过修改ffmpeg源码,定义新选项GROUP_FEATUREFILE和命令行参数"-feature",并实现处理该参数的方法,最终实现将ffmpeg运行信息写入到一个全局文件指针所指向的文件中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

想要一个输出的可指定文件路径的文件,文件的内容是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的文件就都对这一自定义输出文件可见了

就完成了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值