49

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

我希望我不必直接使用 libavcodec,因为我想它会比在格式之间转换的单行函数复杂得多。如果 FFmpeg 不能轻易改装来做到这一点,是否还有另一个基于它的库呢?我听说过 libvlc,但这似乎只公开了一个视频播放API,而不是视频转换。

谢谢。

4

3 回答 3

28

你需要libavcodeclibavformat常见问题解答告诉您:

4.1 是否有示例说明如何使用 FFmpeg 库,尤其是 libavcodec 和 libavformat?

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

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

于 2010-03-08T16:07:01.700 回答
26

如果您只想将 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);
}
于 2010-07-02T15:30:11.647 回答
8

是的,您必须使用 libavcodec 和 libavformat。我认为您应该在 ffmpeg 源代码中阅读有关 ffplay.c 的信息。我认为您从该文件开始会更容易。

于 2010-03-17T09:33:08.580 回答