wasm与键盘交互

与响应鼠标事件相比,响应Canvas键盘事件没有那么直接,因为Canvas本身并不支持键盘事件的响应。我们需要耍一点小手段——在Canvas上添加一个支持键盘事件的其他对象。


创建canvas_kebord.cc:

#ifndef EM_PORT_API
#if defined(__EMSCRIPTEN__)
#include <emscripten.h>
#if defined(__cplusplus)
#define EM_PORT_API(rettype) extern "C" rettype EMSCRIPTEN_KEEPALIVE
#else
#define EM_PORT_API(rettype) rettype EMSCRIPTEN_KEEPALIVE
#endif
#else
#if defined(__cplusplus)
#define EM_PORT_API(rettype) extern "C" rettype
#else
#define EM_PORT_API(rettype) rettype
#endif
#endif
#endif
#include <stdio.h>
EM_PORT_API(void) on_key_down(const char* key) {
	printf("on_key_down(); key:%s\n", key);
}

编译canvas_kebord.cc文件:

 emcc code/1213/canvas_keybord.cc -s "EXPORTED_RUNTIME_METHODS=['ccall']" -o code/1213/canvas_keybord.js

创建canvas_kebord.html:

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <canvas id="myCanvas" tabindex="0"></canvas>
    <script>
        Module = {};
        Module.onRuntimeInitialized = function () {
            var image = new Image();
            image.src = "cover.png";
            image.onload = function () {
                var canvas = document.getElementById('myCanvas');
                var ctx = canvas.getContext("2d");
                canvas.width = image.width;
                canvas.height = image.height;
                ctx.drawImage(image, 0, 0);
                var img_data = ctx.getImageData(0, 0, image.width, image.height).data;
                canvas.focus();
                canvas.addEventListener("keydown", onKeyDown, true);
            }
        }

        function getPointOnCanvas(canvas, x, y) {
            var bbox = canvas.getBoundingClientRect();
            return {
                x: x - bbox.left * (canvas.width / bbox.width),
                y: y - bbox.top * (canvas.height / bbox.height)
            };
        }

        function onKeyDown (event) {
            Module.ccall('on_key_down', null, ['string'], [event.key]);
        }
    </script>
    <script src="canvas_keybord.js"></script>
</body>
</html>

由于canvas无法直接照顾支持键盘事件,这里使用特殊方式实现。

// 有效

canvas.addEventListener('click', (e) => {

        console.log('触发点击了')

})

// 无效

canvas.addEventListener('keydown', (e) => {

        console.log('触发按键了')

})

给canvas一个tabindex,并设置为0或者更大的值,让canvas处于聚焦状态(canvas.focus()),这样就能向它绑定键盘事件了。

浏览器中运行canvas_kebord.html:

 

 控制台成功输出对应键盘事件。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
WebAssembly(Wasm)可以与FFmpeg集成,以在网页中进行视频处理和编解码操作。通过结合Wasm和FFmpeg,您可以在浏览器中实现强大的视频处理功能,如转码、剪辑、水印添加等。 以下是使用Wasm和FFmpeg进行视频处理的一般步骤: 1. 获取FFmpeg的Wasm版本:首先,您需要获取FFmpeg的Wasm版本。有一些项目在GitHub上提供了编译好的Wasm版本,您可以从这些项目中获取FFmpeg的Wasm文件。 2. 加载Wasm模块:将FFmpeg的Wasm文件加载到您的网页中。您可以使用JavaScript的WebAssembly API来加载和实例化Wasm模块。 3. 初始化FFmpeg:在Wasm模块加载完成后,您需要通过调用FFmpeg的初始化函数来初始化FFmpeg环境。这通常涉及到设置输入输出流、注册解码器和编码器等操作。 4. 执行视频处理操作:一旦FFmpeg成功初始化,您可以使用FFmpeg提供的各种函数执行视频处理操作。例如,您可以调用解码函数将视频解码为原始帧数据,然后对帧数据进行处理,最后调用编码函数将处理后的帧数据编码为目标视频格式。 5. 输出处理结果:根据您的需求,您可以将处理后的视频保存到本地文件或直接在网页上播放。 请注意,在使用Wasm和FFmpeg进行视频处理时,考虑到性能和资源的限制是非常重要的。视频处理通常是一项计算密集型任务,可能会对浏览器的性能产生一定的影响。因此,您应该仔细考虑处理的复杂性,并评估在特定设备和浏览器上的性能表现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值