WebAssembly----使用emscripten镜像环境编译ffmpeg4.2

本文介绍了如何在Docker环境下使用emscripten编译ffmpeg为WebAssembly模块。通过docker镜像创建emscripten环境,避免本地编译ffmpeg时可能出现的错误。详细阐述了emscripten的编译选项,如内存管理和函数指针配置,并提供了编译ffmpeg为LLVM bitcode和转换为wasm的脚本示例。注意,虽然ffmpeg可以在Web上使用,但由于浏览器安全限制,不能直接加载本地文件或请求网络,需要自定义IO实现。
摘要由CSDN通过智能技术生成

WebAssembly----使用emscripten镜像环境编译ffmpeg4.2

  • 本文主要讲解了使用emscripten镜像环境来编译ffmpeg为wasm,但是如果用户本地已经搭建好了emscripten环境,那么将本文与镜像相关的内容剔除也可作为本地emscripten编译ffmpeg来阅读
  • 不过笔者亲身实践过,即使本地正常安装了emsdk(普通的c文件能正常编译通过),但一旦编译ffmpeg就会报错,具体原因不详,这也就是本文为何要使用镜像去编译的原因,使用docker镜像提供的环境基本都能编译成功

环境

emscripten编译选项说明


  • 以下是一些常用的选项的说明:
  • 代码优化选项-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" ]
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值