【问题标题】:Compile ffmpeg as stand alone binary将 ffmpeg 编译为独立的二进制文件
【发布时间】:2017-02-20 07:20:14
【问题描述】:

我正在尝试将 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

我有什么遗漏吗?

【问题讨论】:

    标签: ffmpeg compilation


    【解决方案1】:

    即使我没有成功地将所有内容编译到一个二进制文件中,我仍然能够通过以下操作将依赖项上传到 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 压缩代码中包含 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';
    

    【讨论】:

    • i an set process.env['PATH'] 与上面给出的相同,但出现错误 Error: spawn EACCES and i are using aws lamda function and text on aws cli
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      对于纯静态库,这将是棘手和混乱的。您必须构建所需的每个静态库,然后尝试添加额外的 ldflags 来配置。

      另一种选择是一些工具将这些库/elfs/二进制文件打包成一个大文件。其中一些列在这里:Pack shared libraries into the elf

      【讨论】:

      • 好的,我试试。非常感谢!我正在尝试将它与 AWS lambda 一起使用,如果我想使用外部程序,我需要上传一个包含所有内容的二进制文件......
      猜你喜欢
      • 2017-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-29
      • 1970-01-01
      • 2011-09-17
      相关资源
      最近更新 更多