C语言 FFmpeg可以作为一个库而不是一个独立的程序吗?

im9ewurl  于 2023-10-16  发布在  其他
关注(0)|答案(3)|浏览(77)

我想添加视频转换功能,我写的程序。FFmpeg的命令行接口就是ffmpeg -i InputFile OutputFile,但是有没有办法把它作为一个库来使用,这样我就可以做类似ffmpeg_convert(InputFile, OutputFile)的事情了?
我希望我不必直接使用libavcodec,因为我想它将比一行格式之间的转换函数复杂得多。如果FFmpeg不能很容易地进行改造来做到这一点,那么是否有另一个基于它的库可以做到这一点?我听说过libvlc,但它似乎只公开了一个视频 * 播放 * API,而不是视频转换。

xxb16uws

xxb16uws1#

你需要libavcodeclibavformat。FAQ告诉你:
4.1有没有示例说明如何使用FFmpeg库,特别是libavcodec和libavformat?
是的。请阅读FFmpeg文档的开发者指南。或者,检查已经在(projects.html)中包含FFmpeg的许多开源项目之一的源代码。
FFmpeg文档指南可以在ffmpeg.org/documentation.html找到,包括Developer's guide。我建议查看libavformat/output-example.c或者ffmpeg命令行实用程序本身的源代码。

uqxowvwt

uqxowvwt2#

如果你只是想把对ffmpeg的调用作为函数而不是系统调用,你可以很容易地做到。
在ffmpeg.c中,更改:

int main(int argc, char **argv) to int ffmpeg((int argc, char **argv)

然后在你调用ffmpeg函数时,传入一个模仿命令行的数组。为了使它更容易使用一个函数来创建argc,argv变量。

static int setargs(char *args, char **argv)
{
    int count = 0;

    while (isspace(*args)) ++args;
    while (*args) {
        if (argv) argv[count] = args;
        while (*args && !isspace(*args)) ++args;
        if (argv && *args) *args++ = '\0';
        while (isspace(*args)) ++args;
        count++;
    }
}

char **parsedargs(char *args, int *argc)
{
    char **argv = NULL;
    int    argn = 0;

    if (args && *args
        && (args = strdup(args))
        && (argn = setargs(args,NULL))
        && (argv = malloc((argn+1) * sizeof(char *)))) {
          *argv++ = args;
          argn = setargs(args,argv);
    }

    if (args && !argv) free(args);

    *argc = argn;
    return argv;
}

void freeparsedargs(char **argv)
{
    if (argv) {
        free(argv[-1]);
        free(argv-1);
    }
}
    return count;
}

int main()
{
    char **argv;
    char *cmd;
    int argc;

    cmd = "ffmpeg -i infile outfile";
    argv = parsedargs(cmd,&argc);
    ffmpeg(argc, argv);
}
szqfcxe2

szqfcxe23#

是的,你必须使用libavcodec和libavformat。我认为你应该阅读ffmpeg源代码中的ffplay. c。我觉得你从那份文件开始会更容易些。

相关问题