美文网首页
使用web worker和webassembly技术 (Mac

使用web worker和webassembly技术 (Mac

作者: 都江堰古巨基 | 来源:发表于2020-08-18 17:49 被阅读0次

本菜鸡最近在搞FFmpeg嵌入到前端中做解码,初步的想法是通过web worker 建一个解码的线程专门用于解码H264数据,然后主线程负责渲染解码后的数据。
首先要在前端中运行C代码,那就要使用webassembly技术,webassembly技术可以将C/C++、rust代码编译为.wasm文件,然后导入到前端中实现前端运行C/C++、rust代码的效果。而编译生成.wasm文件需要用到emscripten工具
本文中的emscripten版本如下:

emscripten版本

来个简单的C代码:

#include <stdio.h>
int main(int argc, char ** argv) {
    printf("Hello, world!\n");
}
int mytest() {
    printf("this is wasm test!\n");
    return 999;
}

编译上面的C代码为wasm文件(最后生成的文件为JS文件,导入这个.js代码就可以导入.wasm文件):

emcc hello.c -o hello.js -s MODULARIZE=1 -s EXPORT_NAME=Test -s EXTRA_EXPORTED_RUNTIME_METHODS='["ccall"]' -s EXPORTED_FUNCTIONS='["_mytest","_main"]'

新建一个html文件作为演示:

<!DOCTYPE html>
<html>
    <head>
        <title>wasm</title>
    </head>
    <body>
        <h1>test !</h1>
        <button onclick="test()">send a test</button>
        <button onclick="closeWebworker()">close web worker</button>
    </body>
    <script>
        var worker = null
        window.onload = function () {
            // 新建一个worker
            worker = new Worker("test.js")
            // 向子线程传递数据
            worker.postMessage('init')
            worker.onmessage = function (evt) {
                console.log('master reveived msg: ',evt.data)
            }
            var ab = new ArrayBuffer(1);
            // 使用transportObject
            worker.postMessage(ab, [ab]);
        }
        function closeWebworker() {
            worker.terminate()
            worker = null
            console.log('close web worker !!')
        }
        function test() {
            if (worker) {
                worker.postMessage('test')
            } else {
                console.log('web worker has closed !')
            } 
        }
    </script>
</html>

然后是页面中用到的test.js

importScripts('hello.js')

var self = this
function Test2() {
    // 初始化worker
    this.initWorker()
}

Test2.prototype.initWorker = function () {
    console.log('初始化worker !')
}

Test2.prototype.init = async function () {
    self.Module = await initModule()
    postMessage('初始化')
    var testBuffer = new ArrayBuffer(32)
    postMessage(testBuffer,[testBuffer])
}

Test2.prototype.mytest = function () {
    console.log(self.Module._mytest())
}

self.test = new Test2

self.onmessage = function (evt) {
    if (self.test === undefined) {
        console.log('init error !', self.test)
        return ;
    }
    console.log(`子线程Reveived msg: ${evt.data}`)
    switch (evt.data) {
        case 'init':
            self.test.init();
            break;
        case 'test':
            self.test.mytest();
            break;
        default:
            break;
    }
}

function onWasmLoaded() {
    if (test) {
       test.mytest();
    } else {
        console.log("[ER] No decoder!");
    }
}

function initModule() {
    return new Promise((r,j) => {
        r(
            Test({
                onRuntimeInitialized: () => {
                    console.log('初始化wasm!')
                },
            })
        )
    })
}

最后整体的项目结构:

项目结构
运行命令:emrun --no_browser --port 8087 .打开localhost:8087查看效果。

相关文章

  • 使用web worker和webassembly技术 (Mac

    本菜鸡最近在搞FFmpeg嵌入到前端中做解码,初步的想法是通过web worker 建一个解码的线程专门用于解码H...

  • web work

    Web Worker 什么是Web worker?为什么要用它?我们必须要先了解这些,才能更好的去使用这个技术。 ...

  • web worker

    web Worker web Worker 文件单独写在一个文件中,在main worker 中 执行的文件里使用...

  • go 基础 WebAssembly

    Web开发中为什么需要 WebAssembly ,以及在实际开发中如何使用 WebAssembly?带着这些问题开...

  • webwork 前端的多线程解决方案

    多线程技术在web 新标准中,提供新的webworkAPI,让web具有多线程能力. 使用:创建一个Worker对...

  • WebAssembly入门介绍书目录

    什么是WebAssembly? WebAssembly目标 WebAssembly如何适应Web平台? WebAs...

  • Web Worker使用

    最近对Web Worker进行了系统学习,主要看了阮大的教程[https://www.ruanyifeng.com...

  • web worker的介绍和使用

    简介 什么是web worker呢?从名字上就可以看出,web worker就是在web应用程序中使用的worke...

  • web worker 处理多文件并行上传

    一 web worker: 什么是web worker Web Worker为Web内容在后台线程中运行脚本提供...

  • 在vue中怎么使用Web Worker

    在vue项目中不能直接使用web worker,需要使用vue-worker这个库。它提供了run、create等...

网友评论

      本文标题:使用web worker和webassembly技术 (Mac

      本文链接:https://www.haomeiwen.com/subject/fvukjktx.html