Closed gogoend closed 3 years ago
原文:https://itnext.io/build-ffmpeg-webassembly-version-ffmpeg-js-part-1-preparation-ed12bf4c8fac 作者:Jerome Wu 翻译:gogoend
在这一部分,你将会了解:
这一系列文章的目标:
FFmpeg是一个自由、开源的项目,由一些用于处理音频、视频及其它媒体文件或媒体流的库和程序所组成。 它是一个十分有用的库,且目前并没有类似的JavaScript库具有与其完全相同的能力。如果你Google“ffmpeg.js”,你可以找到几个现有的、与我们将要构建的差不多一致的库:
这些库很棒,很多场合下都可以实现开箱即用。然而目前它们存在着下列几个问题:
我曾考虑接管其中某一个项目的仓库,然而经过这些年变化,很多东西都需要修改,因此我决定从头开始,同时为想要学习使用Emscripten来将C/C++库编译到JavaScript的开发者编写一份教程。
开始前,我们需要从FFmpeg的仓库克隆它的源代码。由于master分支正处在开发中,因此我们最好选择某个发行版本分支来编译。 在本系列文章编写时,FFmpeg的最新版本是4.1.4,因此本系列文章将以这一版本为例进行讲解。
master
$ git clone --depth 1 --branch n4.1.4 https://github.com/FFmpeg/FFmpeg
--depth 1 并非必传参数,但如果你不需要获取所有提交的话,它将会加快克隆进程。
--depth 1
在仓库克隆完成后,我们就可以使用gcc来对它进行编译,并确保它能够工作了。
其实如果你比较急的话,你可以跳过这一部分,但根据我的经验来看,最好先适应一下库的构建系统。(FFmpeg使用标准的make,相较于Bazel而言更容易移植。)
构建、安装FFmpeg的相关介绍可参阅仓库根目录下的INSTALL.md:
安装FFmpeg 键入./configure以创建配置,配置选项列表可通过运行configure —help来打印。 configure可从FFmpeg源代码目录之外的目录启动,以在源代码目录树以外的地方构建代码。若要使用该特性,在启动configure时需要使用绝对路径,例如:/ffmpegdir/ffmpeg/configure。 然后键入make以构建FFmpeg。需要使用 GNU Make 3.81 或是更高版本。 键入make install以安装你所构建的所有二进制文件和库。 注意 非系统依赖(例如libx264、 libvpx)默认是禁用的。
./configure
configure —help
configure可从FFmpeg源代码目录之外的目录启动,以在源代码目录树以外的地方构建代码。若要使用该特性,在启动configure时需要使用绝对路径,例如:/ffmpegdir/ffmpeg/configure。
configure
/ffmpegdir/ffmpeg/configure
然后键入make以构建FFmpeg。需要使用 GNU Make 3.81 或是更高版本。
make
键入make install以安装你所构建的所有二进制文件和库。
make install
由于我们并不需要真的安装FFmpeg,因此仅需进行步骤1、2即可。
接下来使用gcc进行构建,在这里我们使用Docker来搭建构建环境。使用Docker,可以很大程度上减少在不同机器上进行构建时发生的挫折和意外,使得你能够更轻松地理解本文。
我们在仓库根目录下创建一个名为build-with-docker.sh的bash脚本,内容如下:
build-with-docker.sh
#!/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是必需的参数。
--disable-x86asm
现在使用下列命令来执行脚本:
$ chmod +x build-with-docker.sh $ ./build-with-docker.sh
接下来需要花费10~30分钟的时间来完成编译,编译速度取决于Internet以及你电脑的硬件配置规格。 在编译过程中,你会看到一大堆警告消息 —— 这是正常情况,因为gcc 9.1引入了更多限制。
这里将会花费一些时间来编译原生的FFmpeg。若一切正常,你将可以通过下列命令来运行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进行编译。
在这一部分,你将会了解:
本系列文章的背景
这一系列文章的目标:
为什么是FFmpeg?
FFmpeg是一个自由、开源的项目,由一些用于处理音频、视频及其它媒体文件或媒体流的库和程序所组成。 它是一个十分有用的库,且目前并没有类似的JavaScript库具有与其完全相同的能力。如果你Google“ffmpeg.js”,你可以找到几个现有的、与我们将要构建的差不多一致的库:
这些库很棒,很多场合下都可以实现开箱即用。然而目前它们存在着下列几个问题:
我曾考虑接管其中某一个项目的仓库,然而经过这些年变化,很多东西都需要修改,因此我决定从头开始,同时为想要学习使用Emscripten来将C/C++库编译到JavaScript的开发者编写一份教程。
怎样使用Docker来构建原生FFmpeg?
开始前,我们需要从FFmpeg的仓库克隆它的源代码。由于
master
分支正处在开发中,因此我们最好选择某个发行版本分支来编译。 在本系列文章编写时,FFmpeg的最新版本是4.1.4,因此本系列文章将以这一版本为例进行讲解。在仓库克隆完成后,我们就可以使用gcc来对它进行编译,并确保它能够工作了。
其实如果你比较急的话,你可以跳过这一部分,但根据我的经验来看,最好先适应一下库的构建系统。(FFmpeg使用标准的make,相较于Bazel而言更容易移植。)
构建、安装FFmpeg的相关介绍可参阅仓库根目录下的INSTALL.md:
由于我们并不需要真的安装FFmpeg,因此仅需进行步骤1、2即可。
接下来使用gcc进行构建,在这里我们使用Docker来搭建构建环境。使用Docker,可以很大程度上减少在不同机器上进行构建时发生的挫折和意外,使得你能够更轻松地理解本文。
我们在仓库根目录下创建一个名为
build-with-docker.sh
的bash脚本,内容如下:现在使用下列命令来执行脚本:
这里将会花费一些时间来编译原生的FFmpeg。若一切正常,你将可以通过下列命令来运行
ffmpeg
:或是
你将可以看到如下内容:
到这里,我们就已经完成了准备过程。接下来移步到 构建WebAssembly版本的FFmpeg——ffmpeg.wasm:第二部分:使用Emscripten编译 ,来使用Emscripten对FFmpeg进行编译。