gogoend / blog

blogs, ideas, etc.
MIT License
9 stars 2 forks source link

[译] 构建WebAssembly版本的FFmpeg——ffmpeg.wasm:第一部分:准备 #43

Closed gogoend closed 3 years ago

gogoend commented 4 years ago

原文:https://itnext.io/build-ffmpeg-webassembly-version-ffmpeg-js-part-1-preparation-ed12bf4c8fac 作者:Jerome Wu 翻译:gogoend

在这一部分,你将会了解:

  1. 本系列文章的背景
  2. 如何使用Docker来构建原生的FFmpeg

本系列文章的背景

这一系列文章的目标:

  1. 为想要学习使用Emscripten来将C/C++库编译到JavaScript的开发者提供一份指南(希望到目前为止这是一份最有用、最详尽的指南)
  2. 个人笔记

为什么是FFmpeg?

FFmpeg是一个自由、开源的项目,由一些用于处理音频、视频及其它媒体文件或媒体流的库和程序所组成。 它是一个十分有用的库,且目前并没有类似的JavaScript库具有与其完全相同的能力。如果你Google“ffmpeg.js”,你可以找到几个现有的、与我们将要构建的差不多一致的库:

这些库很棒,很多场合下都可以实现开箱即用。然而目前它们存在着下列几个问题:

  1. FFmpeg以及Emscripten版本都已过时
  2. 近年来都没有再有过活跃的维护

我曾考虑接管其中某一个项目的仓库,然而经过这些年变化,很多东西都需要修改,因此我决定从头开始,同时为想要学习使用Emscripten来将C/C++库编译到JavaScript的开发者编写一份教程。

怎样使用Docker来构建原生FFmpeg?

开始前,我们需要从FFmpeg的仓库克隆它的源代码。由于master分支正处在开发中,因此我们最好选择某个发行版本分支来编译。 在本系列文章编写时,FFmpeg的最新版本是4.1.4,因此本系列文章将以这一版本为例进行讲解。

$ git clone --depth 1 --branch n4.1.4 https://github.com/FFmpeg/FFmpeg

--depth 1 并非必传参数,但如果你不需要获取所有提交的话,它将会加快克隆进程。

在仓库克隆完成后,我们就可以使用gcc来对它进行编译,并确保它能够工作了。

其实如果你比较急的话,你可以跳过这一部分,但根据我的经验来看,最好先适应一下库的构建系统。(FFmpeg使用标准的make,相较于Bazel而言更容易移植。)

构建、安装FFmpeg的相关介绍可参阅仓库根目录下的INSTALL.md

安装FFmpeg

  1. 键入./configure以创建配置,配置选项列表可通过运行configure —help来打印。

configure可从FFmpeg源代码目录之外的目录启动,以在源代码目录树以外的地方构建代码。若要使用该特性,在启动configure时需要使用绝对路径,例如:/ffmpegdir/ffmpeg/configure

  1. 然后键入make以构建FFmpeg。需要使用 GNU Make 3.81 或是更高版本。

  2. 键入make install以安装你所构建的所有二进制文件和库。

注意

  • 非系统依赖(例如libx264、 libvpx)默认是禁用的。

由于我们并不需要真的安装FFmpeg,因此仅需进行步骤1、2即可。

接下来使用gcc进行构建,在这里我们使用Docker来搭建构建环境。使用Docker,可以很大程度上减少在不同机器上进行构建时发生的挫折和意外,使得你能够更轻松地理解本文。

我们在仓库根目录下创建一个名为build-with-docker.sh的bash脚本,内容如下:

#!/bin/bash
docker pull gcc:4
docker run -it \
  -v $PWD:/usr/src \
  gcc:9.1 \
  sh -c 'cd /usr/src && ./configure --disable-x86asm && make -j4'

基于ffmpeg的一些报错信息,--disable-x86asm是必需的参数。

现在使用下列命令来执行脚本:

$ chmod +x build-with-docker.sh
$ ./build-with-docker.sh

接下来需要花费10~30分钟的时间来完成编译,编译速度取决于Internet以及你电脑的硬件配置规格。 在编译过程中,你会看到一大堆警告消息 —— 这是正常情况,因为gcc 9.1引入了更多限制。

这里将会花费一些时间来编译原生的FFmpeg。若一切正常,你将可以通过下列命令来运行ffmpeg

$ ./ffmpeg

或是

$ docker run -it -v $PWD:/usr/src gcc:9.1 /usr/src/ffmpeg

你将可以看到如下内容:

ffmpeg version n4.1.4 Copyright © 2000–2019 the FFmpeg developers built with gcc 9.1.0 (GCC) configuration: — disable-x86asm libavutil 56. 22.100 / 56. 22.100 libavcodec 58. 35.100 / 58. 35.100 libavformat 58. 20.100 / 58. 20.100 libavdevice 58. 5.100 / 58. 5.100 libavfilter 7. 40.101 / 7. 40.101 libswscale 5. 3.100 / 5. 3.100 libswresample 3. 3.100 / 3. 3.100 Hyper fast Audio and Video encoder usage: ffmpeg [options] [[infile options] -i infile]… {[outfile options] outfile}… Use -h to get full help or, even better, run ‘man ffmpeg’

到这里,我们就已经完成了准备过程。接下来移步到 构建WebAssembly版本的FFmpeg——ffmpeg.wasm:第二部分:使用Emscripten编译 ,来使用Emscripten对FFmpeg进行编译。