FFmpeg 可以用作库,而不是独立程序吗?
Posted
技术标签:
【中文标题】FFmpeg 可以用作库,而不是独立程序吗?【英文标题】:Can FFmpeg be used as a library, instead of a standalone program? 【发布时间】:2011-01-24 23:56:44 【问题描述】:我想在我正在编写的程序中添加视频转换功能。 FFmpeg 的命令行界面就是ffmpeg -i InputFile OutputFile
,但是有没有办法将它用作库,所以我可以做类似ffmpeg_convert(InputFile, OutputFile)
的事情?
我希望我不必直接使用 libavcodec,因为我想它会比在格式之间转换的单行函数复杂得多。如果 FFmpeg 不能轻易改装来做到这一点,是否还有另一个基于它的库呢?我听说过 libvlc,但这似乎只公开了一个视频播放 API,而不是视频转换。
谢谢。
【问题讨论】:
只是出于好奇,您为什么更愿意将其用作 DLL? exec() 的缺点是什么? 我不想在单独的进程中运行它,因为 AFAIK 我无法监控它的进度或在它完成后运行一个函数。 恕我直言,在单独的进程中运行ffmpeg
是更好的主意,这样您的应用程序就不会在漫长的视频编码过程中卡住。
我总是可以在不同的线程中运行它;我的程序已经是多线程的,所以这不是问题。
@AlexCohn 啊,软件中的哪些想法在 10 年后仍然很好?在这十年中,我了解了沙盒、云、智能手机、视频编解码器的漏洞以及许多其他很酷的东西。一切都有权衡。
【参考方案1】:
您需要libavcodec
和libavformat
。 FAQ 告诉你:
4.1 是否有示例说明如何使用 FFmpeg 库,尤其是 libavcodec 和 libavformat?
是的。阅读 FFmpeg 文档的开发人员指南。或者,在 (projects.html) 上查看已包含 FFmpeg 的众多开源项目之一的源代码。
FFmpeg 文档指南可以在ffmpeg.org/documentation.html 找到,包括Developer's guide。我建议查看libavformat/output-example.c
或ffmpeg
命令行实用程序本身的来源。
【讨论】:
【参考方案2】:是的,您必须使用 libavcodec 和 libavformat。我认为您应该在 ffmpeg 源代码中阅读有关 ffplay.c 的信息。我认为您从该文件开始会更容易。
【讨论】:
【参考方案3】:如果您只是想将 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);
【讨论】:
与其更改,不如直接用-Dmain=ffmpeg
调用编译器。
你还需要处理输出(通常去stdin/stderr)和错误处理(如果它调用abort()
或exit()
可以吗?)。以上是关于FFmpeg 可以用作库,而不是独立程序吗?的主要内容,如果未能解决你的问题,请参考以下文章
我们是不是可以在不使用 Datepicker 的情况下将材质 UI 选择器中的 Calendar 组件用作独立组件 - 如果可以,如何?