17 | 如何实现一个 WebAssembly 在线多媒体处理应用(三)?
编写 C/C++ 函数源码
- 深入了解
- 翻译
- 解释
- 总结
本文详细介绍了如何利用WebAssembly(Wasm)实现在线多媒体处理应用的过程。作者首先编写了C/C++函数源码,然后使用Emscripten将其编译成Wasm格式。在C/C++源码中,作者使用了滤镜函数来处理视频图像,并展示了滤镜函数的实现逻辑。通过使用Emscripten进行编译,作者得到了一个名为“dip.wasm”的Wasm二进制模块文件。文章还探讨了Wasm与JavaScript实现滤镜函数的性能提升,并通过性能对比结果展示了Wasm版本函数的帧画面实时处理效率几乎是JavaScript版本函数的一倍之多。最后,读者还可以通过课后练习在其他浏览器中运行Wasm Web应用,并查看不同浏览器下JavaScript版本滤镜函数和Wasm版本滤镜函数的画面实时处理帧率。整篇文章通过实际代码和编译命令的讲解,为读者提供了一个清晰的指导,使他们能够快速了解WebAssembly在多媒体处理应用中的应用和优势。
《WebAssembly 入门课》,新⼈⾸单¥29
全部留言(10)
- 最新
- 精选
- huge我照着例子,试着编译一段求md5的代码, 使用#include <openssl/md5.h> 报错:fatal error: 'openssl/md5.h' file not found 这种依赖第三方库的情况,怎么处理呢
作者回复: 你可以自己写一个 CMakeLists.txt 来让编译器自动查找头文件的所在位置,比如用 include_directories 指令来指定头文件的查找位置。具体可以参考 CMake 的官方文档,或者找找相关的文章。或者如果使用 Clang 也可以看下 Clang 的 -I 参数。
2020-10-262 - 军秋编译提示:clang-6.0: error: unsupported option '--no-entry' 是我版本太低了吗? clang的官方文档也没找到--no-entry 选项。 emcc -v emcc (Emscripten gcc/clang-like replacement + linker emulating GNU ld) 1.39.4 clang version 6.0.1 (https://github.com/emscripten-core/emscripten-fastcomp-clang 98df4be387dde3e3918fa5bbb5fc43e1a0e1daac) (https://github.com/emscripten-core/emscripten-fastcomp 6c7e775325067e33fa60611e619a8b987b6d0c35) (emscripten 1.38.44 : 1.38.31) Target: x86_64-unknown-linux-gnu Thread model: posix InstalledDir: /emsdk_portable/clang/tag-e1.39.4/build_tag-e1.39.4_64/bin Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/6 Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/6.3.0 Selected GCC installation: /usr/lib/gcc/x86_64-linux-gnu/6.3.0 Candidate multilib: .;@m64 Selected multilib: .;@m64 shared:INFO: (Emscripten: Running sanity checks)
作者回复: --no-entry 应该是传给 Linker 的参数,参考:https://lld.llvm.org/WebAssembly.html,可以尝试升级一下 Emscripten 的版本。
2021-03-181 - 张凯大致思路表述明白了,WebAssembly.instantiate这个函数是我们写在JS中?
作者回复: 是的。
2020-11-051 - 木瓜777基于 OpenGL 编写的 C/C++ 应用编译成 Wasm Web 应用,而无需做任何源代码上的修改。Emscripten 会通过相应的 JavaScript 胶水代码来处理好 OpenGL 与 WebGL 的调用映射关系,让你真正地做到“无痛迁移”。 请问目前有没有开源的例子啊?
作者回复: 开源的例子是指?大公司在用的案例吗?
2022-09-15归属地:湖北 - Andy老师: 如果有一个cc文件,要编出来wasm,如下这些写非常简单 emcc dip.cc -s WASM=1 -O3 --no-entry -o dip.wasm 但是如果有很多cc文件,并且在不同的路径中,上面这个命令应该怎么写? 如果这些cc依赖第三方库,比如opencv,应该怎么编译? 如果我们自己的cc文件之前都是用cmake编译的,现在要想编译出来wasm,应该怎么做? 谢谢啦
作者回复: 多个文件也可以直接都列在 emcc 后面,或者通过 CMakeFile 来组织项目的构建依赖关系,然后再使用 Emscripten 的 emconfigure/emmake 来构建项目也是可以的。具体可以参考:https://emscripten.org/docs/compiling/Building-Projects.html
2021-06-24 - champ我是这样计算帧率的: const records = [] let lastDrawTime = 0 function draw() { if (lastDrawTime !== 0) { const duration = Date.now() - lastDrawTime records.push(duration) } lastDrawTime = Date.now() //... setTimeout(draw, 0) } 这样算出来的帧率,在不开启渲染的情况下为170FPS左右,js渲染为80FPS左右,wasm渲染为95FPS左右,好像性能提升并不是很明显。 另外,我发现同样的算法,wasm算出来的图像显示效果要比js算出来的好很多,不知道是什么原因? 老师能解答下吗?
作者回复: 这里提到的显示效果是指?
2021-01-183 - humanwin有2个疑问: 1)c/c++的全局变量编译为wasm后内存是对应到线性内存段,这个规则在哪个文档中可以看到呢?(搜索了一圈好像没找到)。 2)wasm不是有个global section嘛,为什么c/c++的全局变量不是放到那里呢?2023-12-26归属地:福建1
- Zion2019年的时候,了解了几个月webassembly,由于自身原因当时的感觉就是:webassembly只能做些数据转换加密.希望作者再出一些实用webassembly的课程2021-01-281
- Bachue Zhou数据不能有更好地传递方式吗?我觉得通过直接设置线性内存的内容我不太能接受,不能直接把数据通过 WASM 方法的参数送进去吗?2023-05-11归属地:上海
- Jason Yu 于航源码可以参考这里:https://github.com/Becavalier/geektime-wasm-tutorial。2021-04-291