Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C FFmpeg可以用作库而不是独立程序吗?_C_Ffmpeg_Mpeg_Ogg_Libavcodec - Fatal编程技术网

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

C FFmpeg可以用作库而不是独立程序吗?,c,ffmpeg,mpeg,ogg,libavcodec,C,Ffmpeg,Mpeg,Ogg,Libavcodec,我想在我正在编写的程序中添加视频转换功能。FFmpeg执行此操作的命令行界面只是FFmpeg-i InputFile OutputFile,但是否有办法将其用作库,以便我可以执行类似FFmpeg\u convert(InputFile,OutputFile) 我希望我不必直接使用libavcodec,因为我认为在格式之间转换要比一行函数复杂得多。如果FFmpeg不能很容易地进行改造来实现这一点,那么是否有另一个基于它的库可以做到这一点?我听说过libvlc,但它似乎只公开了一个视频播放API,而

我想在我正在编写的程序中添加视频转换功能。FFmpeg执行此操作的命令行界面只是
FFmpeg-i InputFile OutputFile
,但是否有办法将其用作库,以便我可以执行类似
FFmpeg\u convert(InputFile,OutputFile)

我希望我不必直接使用libavcodec,因为我认为在格式之间转换要比一行函数复杂得多。如果FFmpeg不能很容易地进行改造来实现这一点,那么是否有另一个基于它的库可以做到这一点?我听说过libvlc,但它似乎只公开了一个视频播放API,而不是视频转换


谢谢。

您需要
libavcodec
libavformat
。报告告诉你:

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

对。阅读FFmpeg文档的开发者指南。或者,检查已经包含FFmpeg at()的许多开源项目之一的源代码


FFmpeg文档指南可在中找到,包括。我建议查看
libavformat/output example.c
,或者查看
ffmpeg
命令行实用程序本身的源代码。

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

如果您只是想作为函数而不是系统调用调用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);
}

出于好奇,为什么您更愿意将其用作DLL?执行它的缺点是什么?我不想在一个单独的进程中运行它,因为我可能无法监视它的进度或在它完成时运行函数。我最好在一个单独的进程中运行
ffmpeg
,因此,在漫长的视频编码过程中,您的应用程序不会被卡住;我的程序已经是多线程的,所以这不是一个问题。@AlexCohn啊,软件中的哪些想法在十年后仍然是好的?在这十年中,我学到了沙箱、云、智能手机、视频编解码器的漏洞以及许多其他很酷的东西。每件事都有权衡。与其更改它,不如用
-Dmain=ffmpeg
调用编译器。您还需要处理输出(通常转到stdin/stderr)和错误处理(如果调用
abort()
exit()
,可以吗?)。