执行ffmpeg而不使用他们的库可以吗?

Posted

技术标签:

【中文标题】执行ffmpeg而不使用他们的库可以吗?【英文标题】:Is it okay to execute ffmpeg and do not use their library? 【发布时间】:2017-07-18 11:30:22 【问题描述】:

我需要从视频中提取音频并保存。 FFmpeg 有用于此目的的命令。我想知道从我的代码中执行 ffmpeg 而不是用他们的 API 函数编写代码是否是正确的方法。

这种方式的不足是我使用Qt Framework,需要跨平台应用。有时(尤其是在 Windows 中,因为 PATH 变量不会自动设置,因此调用 ffmpeg 将不起作用)用户需要指明可执行文件的路径才能在命令行中运行。

所以这两种变体都可以实现,但哪一种是最好和正确的呢?

我真的不想使用他们的 API,因为它不太容易理解,并且需要时间来编写我自己的代码。

感谢您的建议!

【问题讨论】:

您也可以为此使用包装库,它提供了更简单的 API。快速搜索给了我这个:github.com/astoeckel/acinerella 但可能还有其他人。还有 vlc-qt.tano.si 用于 VLC,专门为 Qt 制作(因此可能是一个不错的选择。)VLC 在后台使用 ffmpeg。 【参考方案1】:

在您的情况下,使用独立的 ffmpeg 似乎是首选。您必须将 ffmpeg 及其依赖项与您的应用程序捆绑在一起。但是无需设置或使用PATH 或其他环境变量来启动ffmpeg。您应该通过提供 ffmpeg 可执行文件的完整路径来做到这一点。

使用 libav API 确实相当棘手。我想提一下,通常(取决于编解码器)ffmpeg 和 libav 不应该被认为是稳定的,在这种情况下,您应该生成一个单独的进程来保护主要可执行文件免受潜在的崩溃。因此,与第一种方法相比,这种方法的复杂性要高得多。

【讨论】:

“将 ffmpeg 与您的应用程序捆绑在一起”是什么意思?正如你所说,我只需要在用户机器上安装 ffmpeg 并找到 ffmpeg 可执行文件的完整路径。然后运行类似的东西: QProcess SavingProcess; ... saveProcess.start("\"C:/Program Files/FFmpeg/ffmpeg.exe\" -i \"C:/Users/Mikhail/Downloads/video.wmv\" -f mp3 -vn \"C: /Users/Mikhail/Videos/extract_audio.mp3\""); 好吧,在用户的机器上找到 ffmpeg 可能相当棘手。在这种情况下,可能更好的解决方案是允许用户手动指定 ffmpeg 位置。【参考方案2】:

声明:我本人从未将 Qt 与 ffmpeg 一起使用过,但对 Qt 有很多经验。

Qt 倾向于尝试将所有内容都放在他们的库中,为了方便起见包装了许多其他内容。大多数时候(所有我测试过的),仍然可以很容易地使用原始库而没有麻烦,但是 Qt 便于集成。

例如:QOpenGLWidgetOpenGL 及其小部件系统的包装,添加了 signalsslots 等。我使用普通 OpenGL 进行了一些测试,效果很好。

在另一个项目中,我们(我的团队,不是特别是我)使用 ffmpeg 在 QtWidget 上显示视频。它适用于有限的问题(由于其他架构要求)。

考虑到您的用例,尤其是您使用 ffmpeg 进行后台处理而不是显示视频,您可能会在 IMO 中以高成功率继续。

【讨论】:

以上是关于执行ffmpeg而不使用他们的库可以吗?的主要内容,如果未能解决你的问题,请参考以下文章

Access 2013:我可以使用数据宏触发 MS SQL SP 而不延迟 Access 中的执行吗?

FFMPEG--windows安装

C# 和 FFmpeg 最好没有 shell 命令?

我可以在 node.js 中要求一个函数而不执行整个所需文件吗?

为什么这个C#代码不按顺序执行?不是ASYNC(至少我认为不是)

x86的库和arm的.o文件能链接吗