前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >编译WebAssembly版本的FFmpeg(ffmpeg.wasm):(1)准备

编译WebAssembly版本的FFmpeg(ffmpeg.wasm):(1)准备

作者头像
智影Yodonicc
发布2022-04-15 09:48:08
2.7K0
发布2022-04-15 09:48:08
举报
文章被收录于专栏:智影Yodonicc

编译WebAssembly版本的FFmpeg(ffmpeg.wasm):(1)准备

作者:Jerome Wu 原文链接:Build FFmpeg WebAssembly version (= ffmpeg.wasm): Part.1 Preparation 译者:Yodoxu 2020年8月更新:教程已更新,可在MacOS中运行。

在这一部分中,你将了解到:

  1. 这个系列的背景
  2. 如何用Docker构建原生的FFmpeg(以及在MacOS中不使用docker)。

本系列的背景

这个系列的文章旨在为以下目的服务:

  1. 为那些想学习如何使用Emscripten将C/C++库编译成JavaScript的人提供指南(希望是目前最有用、最详细的指南)
  2. 个人笔记

为什么是FFmpeg?

FFmpeg是一个免费的开源项目,由一套庞大的软件库和程序组成,用于处理视频、音频、其他多媒体文件和流。(来自维基百科)

它是一个有用的库,没有一个JavaScript库具有完全相同的功能。如果你在谷歌上搜索 “ffmpeg.js”,你会发现很少有与我们将要建立的库完全相同的现有库。

  • ffmpeg.js: https://github.com/Kagami/ffmpeg.js
  • videoconverter.js: https://github.com/bgrins/videoconverter.js

这些库很好,在大多数情况下都可以使用,但它们存在以下问题。

  1. FFmpeg和Emscripten的版本都已经过时了。
  2. 多年来没有积极维护。(Kagami/ffmpeg.js在2020年4月继续其开发)

我考虑过也许可以接管其中一个仓库,但由于这些年变化太大,我决定从头开始,同时写了这个系列的教程,帮助人们学习如何在现实(工程)世界的C/C++库中使用Emscripten。

如何用Docker构建原生FFmpeg

首先,我们需要从FFmpeg的仓库中克隆源代码,由于主分支(master)正在开发中,我们最好选择一个特定的版本来编译。

在我写这个文章的时候,FFmpeg的最新稳定版本是n4.3.1,所以我们将在文章中使用这个版本。

代码语言:javascript
复制
	# Use depth=1 to download only the latest version
	git clone --depth 1 --branch n4.3.1 https://github.com/FFmpeg/FFmpeg

在完成克隆版本库后,是时候用GCC构建以确保它的工作。

实际上,如果你很着急的话,你可以跳过这一部分,但根据我的经验,最好先熟悉一下库的构建系统。

构建和安装FFmpeg的说明可以在版本库根目录下的INSTALL.md中找到。

代码语言:javascript
复制
Installing FFmpeg:
1. Type `./configure` to create the configuration. A list of configure options is printed by running `configure -help`.`configure` can be launched from a directory different from the FFmpeg sources to build the objects out of tree. To do this, use an absolute path when launching `configure`, e.g. `/ffmpegdir/ffmpeg/configure`.

2.Then type `make` to build FFmpeg. GNU Make 3.81 or later is required.

3.Type `make install` to install all binaries and libraries you built.

NOTICE
- - -
	- Non system dependencies (e.g. libx264, libvpx) are disabled by default.

由于我们不需要实际安装FFmpeg,只需要步骤1和2。

有两种构建方式,一种是原生方式,需要你安装软件包(如emsdk,Node.js)。大多数时候,它是有效的,但有时你可能会面临错误,由于包的版本和操作系统的变化而难以解决。另一种方法是使用Docker,它提供了一个稳定和静态的构建环境。我们强烈建议使用Docker,因为它可以节省你安装(和删除)软件包的时间。

我不会在这里介绍如何安装软件包,但由于我把脚本分成build.shbuild-with-docker.sh,你可以自己安装所有的软件包并运行build.sh

为了确保本教程能够达到最大的环境覆盖率(支持更多的操作系统),我使用Github Actions来测试它在Linux和MacOS上是否有效。对于Linux用户,我将使用Docker方式/build-with-docker.sh来构建。对于MacOS用户,由于Github Actions不支持Docker,我将使用本地方式/build.sh进行构建。

现在,让我们创建一个名为build.sh的文件,内容如下。

代码语言:javascript
复制
#!/bin/bash -x
# gcc 8 is used in this tutorial, other versions may fail
./configure --disable-x86asm
make -j

要以本地方式构建,你只需要运行命令:

代码语言:javascript
复制
$ bash build.sh

要用Docker构建,创建一个名为build-with-docker.sh的文件,内容如下。

代码语言:javascript
复制
#!/bin/bash -x
docker pull gcc:8
docker run \
  -v $PWD:/usr/src \
  gcc:8 \
  sh -c 'cd /usr/src && bash build.sh'

然后运行命令:

代码语言:javascript
复制
bash build-with-docker.sh

--disable-x86asm是必须的,因为我们不打算使用x86装配功能。 根据你的网速和电脑的硬件规格,可能需要10~30分钟才能完成编译。 在编译过程中看到大量的警告是正常的,因为gcc 9引入了更多的限制条件。

它应该需要一些时间来编译本地的FFmpeg。如果一切正常,你应该可以用下面的命令运行ffmpeg

代码语言:javascript
复制
$ ./ffmpeg

你应该能看到类似于这样的结果:

*ffmpeg version n4.3.1 Copyright © 2000–2019 the FFmpeg developers** *built with gcc 8 (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’*

你可以在这里访问Github库,了解它的工作细节:https://github.com/ffmpegwasm/FFmpeg/tree/n4.3.1-p1

并随时在这里下载构建代码:https://github.com/ffmpegwasm/FFmpeg/releases/tag/n4.3.1-p1

现在我们已经完成了准备工作,让我们继续编译WebAssembly版本的FFmpeg( ffmpeg.wasm):(2)用Emscripten编译,开始用Emscripten编译FFmpeg。😃

注:特别感谢技术指导dazhao(赵达)对本文翻译的审阅指正

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-04-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 编译WebAssembly版本的FFmpeg(ffmpeg.wasm):(1)准备
    • 本系列的背景
      • 为什么是FFmpeg?
        • 如何用Docker构建原生FFmpeg
        相关产品与服务
        容器镜像服务
        容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档