【问题标题】:Can FFmpeg be used as a library, instead of a standalone program?FFmpeg 可以用作库,而不是独立程序吗?
【发布时间】: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 年后仍然很好?在这十年中,我了解了沙盒、云、智能手机、视频编解码器的漏洞以及许多其他很酷的东西。一切都有权衡。

标签: c ffmpeg mpeg ogg libavcodec


【解决方案1】:

您需要libavcodeclibavformatFAQ 告诉你:

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

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

FFmpeg 文档指南可以在ffmpeg.org/documentation.html 找到,包括Developer's guide。我建议查看libavformat/output-example.cffmpeg 命令行实用程序本身的来源。

【讨论】:

    【解决方案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()可以吗?)。
      猜你喜欢
      • 1970-01-01
      • 2019-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多