我们如何确定 ffmpeg 所需的依赖项

Posted

技术标签:

【中文标题】我们如何确定 ffmpeg 所需的依赖项【英文标题】:How do we determine the required dependencies for ffmpeg 【发布时间】:2021-06-12 02:25:14 【问题描述】:

我已经在 ubuntu 上安装了 ffmpeg。我将把编译好的 ffmpeg 和所需的依赖项复制到一个目录中,然后将该目录复制到另一台机器上。这样我们就可以在另一台机器上运行 ffmpeg 而无需安装。我们如何确定需要复制的依赖项?在此页面上看到说明:https://trac.ffmpeg.org/wiki/CompilationGuide/Ubuntu,但它没有解释 ffmpeg 所需的依赖项。

当我使用 ldd ffmpeg 时,我得到了类似的东西:

    linux-vdso.so.1 (0x00007fffe20fd000)
    libavdevice.so.58 => /lib/x86_64-linux-gnu/libavdevice.so.58 (0x00007fc116e90000)
    libavfilter.so.7 => /lib/x86_64-linux-gnu/libavfilter.so.7 (0x00007fc116b10000)
    libavformat.so.58 => /lib/x86_64-linux-gnu/libavformat.so.58 (0x00007fc116890000)
    libavcodec.so.58 => /lib/x86_64-linux-gnu/libavcodec.so.58 (0x00007fc1152d0000)
    libavresample.so.4 => /lib/x86_64-linux-gnu/libavresample.so.4 (0x00007fc1152a0000)
    libpostproc.so.55 => /lib/x86_64-linux-gnu/libpostproc.so.55 (0x00007fc115270000)

这些是必需的依赖项吗?它没有列出 bin、include 或 share 文件夹下的文件。

【问题讨论】:

【参考方案1】:

这可能不是构建可移植二进制文件的最佳方式。

您看到的是库依赖项,但请注意:

此库中的每一个也将具有它们自己的依赖项,您还需要跟踪和复制这些依赖项; 它们可能与目标计算机上的库版本冲突,需要您使用技巧(例如设置 LD_LIBRARY_PATH)来加载正确版本的库; 您仍然会丢失任何非 lib 依赖项(例如配置文件)。

此外,仅将所有这些库复制到另一台机器并不能保证它们会在那里运行,除非它使用相同的发行版。例如,它们可能是为不同的 glibc 目标构建的。

一些更好的方法是:

    改为构建完全静态的二进制文件: 这通常可以通过在编译时添加“-static”作为 LDFLAGS 环境变量的第一个参数来实现。您将需要拥有或构建 ffmpeg 所依赖的所有库的静态版本。一些发行版提供静态库版本,而另一些则不提供,因此请准备好自己构建所有库。 生成的二进制文件将包含捆绑的所有依赖项,并且应该在任何地方运行 (1)

    在 chroot 下安装/构建软件: 您可以安装一些发行版的最小 chroot,并在那里构建您需要的一切。 然后你可以在其他机器周围移动 chroot,它应该可以在任何地方工作 (1)。 以下是获取最小 Gentoo chroot 的说明:https://wiki.gentoo.org/wiki/Chroot

    尝试使用 ELF Statifier 工具: 这些并不总是适用于所有应用程序,但值得一试。 他们将完成这项肮脏的工作以找到所有共享的 lib 依赖项并将所有这些依赖项捆绑到一个二进制文件中: http://statifier.sourceforge.net/

(1) - 到处都意味着与您的构建机器相同的架构和相同或更高的内核版本。 如果您想更进一步并创建与(很多)旧内核兼容的静态二进制文件,您还需要构建 glibc 设置“--enable-kernel=version”配置开关。

【讨论】:

感谢您的回复!如果我先从同类型的机器开始呢?例如,我在 ubuntu 20.04 上构建它们,并将它们复制到 ubuntu 20.04。 这应该可行,因为您可以找到并复制所有依赖项(以及依赖项的依赖项)。您可以使用“dpkg-query -L ffmpeg”查看哪些文件是包的一部分,以帮助您进行调查。 我运行了 dpkg-query -L ffmpeg 并在 /usr/bin/ 和 /usr/share/ 下看到了一些文件。我认为应该包括 /lib/ 和 /usr/lib/ 下的一些文件?顺便说一句,ldd ffmpeg 不是找到依赖的正确命令? 有 2 个不同的东西: ldd 命令将列出库依赖项,这些文件绝对是命令工作所必需的最小限度。 dpkg-query -L 将列出软件包中包含的所有文件。也许有些是强制性的,也许有些不是。它们可能只是一些不必要的配置或插件文件。【参考方案2】:

您似乎只想让某种离线文件在机器之间移动。 你考虑过使用 snap 吗?

您可以使用以下命令在一台机器上下载 snap:

snap download ffmpeg

这将生成2个文件,要安装在另一台机器上,只需复制它们然后运行:

  snap ack ffmpeg_1286.assert
  snap install ffmpeg_1286.snap

【讨论】:

以上是关于我们如何确定 ffmpeg 所需的依赖项的主要内容,如果未能解决你的问题,请参考以下文章

JavaCV精简依赖包:如何只依赖本地平台所需的最小依赖包

如何确定光流所需的处理器速度?

如何确定使用 NX 运行增量构建所需的提交范围

Vue:如何在 CI 平台上找出构建引擎所需的依赖项?

如何确定我的tomcat应用程序所需的Openshift Pod的资源限制?

如何确定特定 win32 api 调用所需的 windows 库?