1. 前言webassembly/wasm webassembly 或者 wasm 是一个可移植、体积小、加载快并且兼容 web 的全新格式。
webassembly的名字带个汇编assembly,所以我们从其名字上就能知道其意思是给web使用的汇编语言,是通过web执行低级二进制语法。
但是webassembly并不是直接用汇编语言,而提供了抓换机制(llvm ir),把高级别的语言(c,c++和rust)编译为webassembly,以便有机会在浏览器中运行。主要是解决目前js语言的效率问题,设计立足点为快速,内存安全和开放。所以是一种运行机制,一种新的字节码格式(.wasm)
官网介绍:https://www.wasm.com.cn/
2. 安装ubuntu 20.04ubuntu20.04 安装emcc编译最方便,只需要简单的几个命令即可完成。
镜像下载地址: http://mirrors.aliyun.com/ubuntu-releases/20.04/
下载之后,安装系统。
我这里使用vmware workstation pro 15.5 虚拟机安装系统。
安装的过程就不多说了,常规步骤,都比较简单。
系统安装完毕之后需要安装vmtools工具才可以放大自适应桌面,访问共享目录,支持复制粘贴。 如果在下拉菜单里,安装vm tools工具的按钮是灰色的,需要将cd挂载选项,改成自动检测,然后关闭系统,关闭虚拟机,重新再打开,再启动系统,再次打开下拉菜单,就可以选择工具安装了。
将弹出的压缩包拷贝出来,解压,运行里面的脚本,然后一直回车确认,最后就可以安装完成。 注意: 安装过程中有no 这种选项的时候要注意,要输入yes,在按下回车,不然就直接结束安装了。
3. ubuntu 20.04安装emcc编译器安装emcc编译器之前需要安装python,ubuntu20.04 系统安装之后,系统默认是安装了python 的, 这个就不用管了。
emcc编译器的代码在github仓库里,需要安装git工具,这个系统没自动安装,需要自己安装。
wbyq@wbyq:~/work_pc/webassembly/emsdk$ sudo apt install git编译代码需要用到make命令,make也没有安装,需要手动安装。
安装之后,就可以继续下面的步骤了。
(1)创建工作目录,存放接下来下载的相关文件
xl@xl:~/work$ mkdir wasm xl@xl:~/work$ cd wasm/(2)从仓库克隆项目
xl@xl:~/work/wasm$ git clone https://github.com/emscripten-core/emsdk.git 正克隆到 'emsdk'... remote: enumerating objects: 3138, done. remote: total 3138 (delta 0), reused 0 (delta 0), pack-reused 3138 接收对象中: 100% (3138/3138), 1.66 mib | 174.00 kib/s, 完成. 处理 delta 中: 100% (2043/2043), 完成. wbyq@wbyq:~/work_pc/webassembly$ ls emsdk wbyq@wbyq:~/work_pc/webassembly$ cd emsdk/ wbyq@wbyq:~/work_pc/webassembly/emsdk$ ls bazel emscripten-releases-tags.json emsdk_env.bat emsdk_env.ps1 emsdk.ps1 legacy-emscripten-tags.txt readme.md docker emsdk emsdk_env.csh emsdk_env.sh emsdk.py license scripts emcmdprompt.bat emsdk.bat emsdk_env.fish emsdk_manifest.json legacy-binaryen-tags.txt llvm-tags-64bit.txt test(3)安装最新的编译器
wbyq@wbyq:~/work/wasm/emsdk$ ./emsdk install latest resolving sdk alias 'latest' to '3.1.4' resolving sdk version '3.1.4' to 'sdk-releases-upstream-39e60dda6945cfcd6487725bdb1361ae7975173f-64bit' installing sdk 'sdk-releases-upstream-39e60dda6945cfcd6487725bdb1361ae7975173f-64bit'.. installing tool 'node-14.18.2-64bit'..等待片刻,即可全部下载完成。
(4)激活sdk
xl@xl:~/work/wasm/emsdk$ ./emsdk activate latest(5)生效环境变量
xl@xl:~/work/wasm/emsdk$ source emsdk_env.sh
(6)查看编译器版本详细信息
该命令只能在当前终端生效,可以将命令加到etc/profile里,重启系统全局生效。
4. 编写c/c++代码测试下面编写一个c语言代码,导出函数接口,给前端js调用测试。
(1)编写简单的c代码,提供1个测试函数
#include #include #include #include int func_sum(int x, int y) { return x + y; }(2)编译测试
emcc app.c -o app.js -s exported_functions=['_func_sum','_malloc','_free'] -s wasm=1exported_functions 里填写可以导出给js调用的函数接口。
(3)编译成功生成app.js和app.wasm
(4)编写一个html文件。名称设置为: index.html
wasm test function run1() { console.log('100+50=',_func_sum(100,50)) } (5)启动http服务器
python3 -m http.server
(6)打开浏览器访问
按下f12,查看控制台的输出。
http://127.0.0.1:8000/index.html5. 编译ffmpeg(1)下载ffmpeg源码 切换分支到4.1
git clone https://git.ffmpeg.org/ffmpeg.git cd ffmpeg git checkout -b 4.1 origin/release/4.1(2)编译
emconfigure ./configure --cc=emcc --enable-cross-compile --target-os=none --arch=x86_32 --cpu=generic --disable-ffplay --disable-ffprobe --disable-asm --disable-doc --disable-devices --disable-pthreads --disable-w32threads --disable-network --disable-hwaccels --disable-parsers --disable-bsfs --disable-debug --disable-protocols --disable-indevs --disable-outdevs --enable-protocol=file
(3)编写c代码,测试ffmpeg解码,编译
emcc app.c ffmpeg-4.4-wasm/lib/libavformat.a ffmpeg-4.4-wasm/lib/libavcodec.a ffmpeg-4.4-wasm/lib/libswresample.a ffmpeg-4.4-wasm/lib/libavutil.a -i ffmpeg-4.4-wasm/include -s exported_functions=['_malloc','_free','ccall','allocate','utf8tostring','_write_file','_print_version','_get_filesize','_read_file','_getvideoframe','_getvideowidth','_getvideoduration','_getvideoheight','_deletememory','_find_decoder'] -s wasm=1 -s assertions=0 -s total_memory=167772160 -s allow_memory_growth=1 -o out/ffmpeg_decoder.js(4)开启服务器
python -m http.server(5)调用测试ffmpeg
百大案例 | “多合一”+“统一管”,华为护航墨西哥道路和桥梁网络和数据安全
工业物联网网关在工业生产中的重要价值:降本增效
华为多网协同解决方案
福特汽车正考虑自主生产电池
集成电路EDA创新生态发展高峰论坛上芯和半导体发表主题演讲
WebAssembly技术_编译ffmpeg(ubuntu20.04)
Model X车主称自动巡航失灵导致车祸 特斯拉:不背这锅
无线通信 第一章 无线通信基础(下)
估算单向电机启动电容
依顿电子发布2018年半年报,实现营业收入15.09亿元
中国空间站多久能建成_建设空间站的意义
场效应管逆变器电路图大全(六款场效应管逆变器电路图)
多通道RF到数据开发平台助力相控阵原型开发
世界上飞行时间最长、距离最远、高度最高的千里眼!
如何实现国产下一代阻变存储器真正超越
魅蓝metal评测 千元良品青年首选
合约交易模式系统开发平台搭建
AGM X2:骁龙835+8GB运存+256内存,真安卓机皇!
瑞可达拟发行9.5亿元可转债 加码电池连接器领域
张力传感器常见的影响因素有哪些