文章目录
WebAssembly----使用emscripten镜像环境编译ffmpeg4.2
- 本文主要讲解了使用emscripten镜像环境来编译ffmpeg为wasm,但是如果用户本地已经搭建好了emscripten环境,那么将本文与镜像相关的内容剔除也可作为本地emscripten编译ffmpeg来阅读
- 不过笔者亲身实践过,即使本地正常安装了emsdk(普通的c文件能正常编译通过),但一旦编译ffmpeg就会报错,具体原因不详,这也就是本文为何要使用镜像去编译的原因,使用docker镜像提供的环境基本都能编译成功
环境
- 本示例利用docker镜像创建emscripten环境,因此请确保已有docker环境,然后参照此篇文章:https://blog.csdn.net/huweijian5/article/details/104258142
- 假如不用docker镜像,那么也可以参考官网搭建好emscripten环境
emscripten编译选项说明
-
详细的编译选项请看如下文档:
- Emscripten Compiler Frontend (emcc) — Emscripten 1.39.6 documentation
https://emscripten.org/docs/tools_reference/emcc.html?highlight=emcc
- Emscripten Compiler Frontend (emcc) — Emscripten 1.39.6 documentation
-
在编译工程前可以先阅读下官方Building Projects这一节的说明: Building Projects — Emscripten 1.39.6 documentation
- 以下是一些常用的选项的说明:
- 代码优化选项-O(开发时建议不使用): https://emscripten.org/docs/optimizing/Optimizing-Code.html
- js代码生成选项-s:此选项的设置会改变生成的胶水代码,详细查看https://github.com/emscripten-core/emscripten/blob/master/src/settings.js
- -s FORCE_FILESYSTEM=1:强制启用文件系统,当使用外挂文件包即在preload模式时需要启用
- -s RESERVED_FUNCTION_POINTERS: 保留的函数指针的个数,当在运行时增加函数时(比如要调用Module.addFunction())需要此选项,可以根据实际情况设置,如果不够在运行时会抛出“ Unable to grow wasm table. Use a higher value for RESERVED_FUNCTION_POINTERS or set i.”;如果不确定,按照提示的增加 -s ALLOW_TABLE_GROWTH=1
- -s EXTRA_EXPORTED_RUNTIME_METHODS="[‘addFunction’,‘ccall’,‘cwrap’]": 在运行时export的函数,比如要使用Module.addFunction(),则需要加上,要使用ccall,cwrap也得加上;至于要知道可以export哪些的话,那就可以从一个简单的emscripten生成的胶水代码js中查找,直接搜索EXTRA_EXPORTED_RUNTIME_METHODS关键字可以快速定位到;这些函数都是emscripten为我们封装的函数,让我们使用起来更方便快捷
- -s ALLOW_MEMORY_GROWTH=1:开启此模式则内存可以运行时动态扩大,相比较TOTAL_MEMORY更符合实际运用场景,建议加上
- -s TOTAL_MEMORY: 内存,默认是16MB,单位字节,即16777216
- -s TOTAL_STACK:栈空间,默认是510241024
- -I “yourIncludeDir” : 包含的一些文件目录,比如头文件的目录
- -s ASSERTIONS=2:用于为内存分配错误启用运行时检查,推荐开发时打开
- -s SAFE_HEAP=1: 增加了额外的内存访问检查,并将为诸如非内联化0(dereferencing 0)和内存对齐等问题提供清晰的错误,推荐开发时打开
- -s EXCEPTION_DEBUG=1: 在emscripten中打印异常,推荐开发时打开
编译ffmpeg示例
将ffmpeg编译成LLVM bitcode
-
下载前先说下目录结构
- ffmpeg - configure - Makefile - ... - build_decoder.sh - run_build_decoder.sh
-
下载ffmpeg源代码放置在ffmpeg,如下
git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg
-
以上命令会下载最新版本的ffmpeg,我当时的最新版本就是4.2了
在ffmpeg目录下先执行./configure,否则可以会报一些文件找不到的错误
-
在ffmpeg同级目录下新建build_decoder.sh文件
echo "Beginning Build:" rm -r dist mkdir -p dist cd ffmpeg echo "emconfigure" emconfigure ./configure --cc="emcc" --cxx="em++" --ar="emar" --ranlib="emranlib" --prefix="$(pwd)/../dist" --enable-cross-compile --target-os=none \ --arch=x86_64 --cpu=generic --enable-gpl --enable-version3 --disable-avdevice --disable-swresample --disable-postproc --disable-avfilter \ --disable-programs --disable-logging --disable-everything --enable-avformat --enable-decoder=hevc --enable-decoder=h264 --enable-decoder=aac \ --disable-ffplay --disable-ffprobe --disable-asm --disable-doc --disable-devices --disable-network --disable-hwaccels \ --disable-parsers --disable-bsfs --disable-debug --enable-protocol=file --enable-demuxer=mov --enable-demuxer=flv --disable-indevs --disable-outdevs \ --disable-htmlpages --disable-manpages --disable-podpages --disable-txtpages if [ -f "Makefile" ]