C FFmpeg可以用作库而不是独立程序吗?
我想在我正在编写的程序中添加视频转换功能。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-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()
,可以吗?)。