FFmpeg可以用作库而不是独立程序吗?

42 c mpeg ffmpeg ogg libavcodec

我想为我正在编写的程序添加视频转换功能.FFmpeg用于执行此操作的命令行界面很简单ffmpeg -i InputFile OutputFile,但是有没有办法将其用作库,所以我可以做类似的事情ffmpeg_convert(InputFile, OutputFile)

我希望我不必直接使用libavcodec,因为我认为它将比单行函数更复杂,以便在格式之间进行转换.如果FFmpeg无法轻易改装来执行此操作,是否可能有另一个基于它的库?我听说过libvlc,但这似乎只暴露了一个视频播放 API,而不是视频转换.

谢谢.

Chr*_*oph 24

你需要libavcodeclibavformat.该FAQ告诉你:

4.1是否有说明如何使用FFmpeg库的示例,特别是libavcodec和libavformat?

是.阅读FFmpeg文档的开发人员指南.或者,检查已经在(projects.html)中包含FFmpeg的众多开源项目之一的源代码.

可以在ffmpeg.org/documentation.html上找到FFmpeg文档指南,包括开发人员指南.我建议查看libavformat/output-example.c或者可能是ffmpeg命令行实用程序本身的来源.


小智 24

如果你只想调用ffmpeg作为函数而不是系统调用,你可以很容易地做到这一点.

在ffmpeg.c中,更改:

int main(int argc, char **argv) to int ffmpeg((int argc, char **argv)
Run Code Online (Sandbox Code Playgroud)

然后在你的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);
}
Run Code Online (Sandbox Code Playgroud)

  • 而不是更改它,只需使用`-Dmain = ffmpeg`调用编译器. (15认同)

ded*_*ihp 7

是的,你必须使用libavcodec和libavformat.我想你应该在ffmpeg源代码中读到关于ffplay.c的内容.我认为从这个文件开始会更容易.无论如何,我已经使用这些库做了一些应用程序,请在rtstegvideo.sourceforge.net上查看.

希望这有帮助......