将ffmpeg编译为独立二进制文件

3
我正在尝试把ffmpeg编译成独立二进制文件(因为我想在AWS Lambda中使用它)。
我可以在编译服务器上成功地运行,但如果我从另一台服务器复制该二进制文件并运行它,则会出现以下错误: ./ffmpeg: error while loading shared libraries: libvdpau.so.1: cannot open shared object file: No such file or directory 所以看起来某些内容没有被包含在二进制文件中。根据我的阅读,我需要使用标记--disable-shared--enable-static来编译ffmpeg,我已经这样做了。
PATH="$HOME/bin:$PATH" PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig" ./configure \
  --prefix="$HOME/ffmpeg_build" \
  --pkg-config-flags="--static" \
  --extra-cflags="-I$HOME/ffmpeg_build/include" \
  --extra-ldflags="-L$HOME/ffmpeg_build/lib" \
  --bindir="$HOME/bin" \
  --disable-shared \
  --enable-static \
  --enable-gpl \
  --enable-libass \
  --enable-libfreetype \
  --enable-libmp3lame \
  --enable-libvpx \
  --enable-libx264
PATH="$HOME/bin:$PATH" make
make install
make distclean
hash -r

我是否漏掉了什么?

3个回答

4

虽然我没有成功将所有内容编译成一个二进制文件,但是我已经成功通过以下方式将依赖项上传到了AWS Lambda:

将所有依赖项复制到一个文件夹中

我编写了一个Python脚本来完成这个操作。该脚本依赖于lld来列出依赖项。

#!/usr/bin/env python
import subprocess
import os
from shutil import copyfile

def copyLibraries(bin, destination):
  if not os.path.exists(destination):
    os.makedirs(destination)

  output = subprocess.Popen(["ldd", bin], stdout=subprocess.PIPE).communicate()[0]
  for l in output.split('\n'):
    if len(l.split("=> ")) > 1:
      lib_location = l.split("=> ")[1].split(" ")[0].strip()
      if lib_location != "":
        real_location = os.path.realpath(lib_location)

        lib_name = real_location.split('/')[-1]

        copyfile(real_location, destination + lib_name)

        if os.path.islink(lib_location):
          link_name = lib_location.split('/')[-1]
          if link_name != lib_name:
            os.symlink(real_location, destination + link_name)

copyLibraries("/home/ubuntu/bin/ffmpeg", "/home/ubuntu/libs/")

AWS Lambda

  • 在Lambda打包的代码中,需要包含FFMPEG二进制文件以及libs文件夹。
  • 在Lambda代码中,需要包含相应的路径。在node.js中,可以这样实现:

.

process.env['PATH'] = process.env['PATH'] +
  ':' +    process.env['LAMBDA_TASK_ROOT'] +
  ':' + process.env['LAMBDA_TASK_ROOT'] + '/bin' +
  ':' + process.env['LAMBDA_TASK_ROOT'] + '/lib';

我尝试设置process.env['PATH'],与上述相同,但出现了错误Error: spawn EACCES。我正在使用AWS Lambda函数和AWS CLI文本。 - Pramod Gehlot

3

添加 --extra-ldexeflags="-static" 可以获取独立的ffmpeg。


1

--enable-static--disable-shared 只影响 libav* 二进制文件。它不会阻止链接器使用必要的共享对象文件。

对于纯静态库,这将变得棘手而混乱。您必须构建您需要的每个静态库,然后尝试向配置添加附加的 ldflags。

另一种选择是将这些库/elfs/二进制文件打包成一个大文件的工具。其中一些列在此处:将共享库打包到 elf 中


好的,我会尝试一下。非常感谢!我正在尝试在AWS Lambda中使用这个,如果我想要使用外部程序,我需要上传一个包含所有内容的二进制文件。 - Guig

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接