跳到主要内容

rust遇上node

· 5 分钟阅读
月子喵

最近在写那个终端的播放器, 遇到了一个大难题 ¿怎么在 Nodejs 里面放音乐呢, 要知道扬声器可是硬件,Nodejs 只是运行于 V8 的脚本

擦汗.png
Preview

在 Github 上面搜了一堆的 nodejs 播放器的实现, 都是调用本地播放器进行播放的, 这个问题就比较大不容易跨平台, 所以还是得自己写一个

寻找音频库

学了这么久的 Rust 还没实打实的应用过, 所以就打算用 Rust 来做和底层交互的语言, 在 crates 上面找了一会儿发现了这么的一个库,

虽然是一个用来做游戏的音频库, 调用的是 OpenAL 的接口, 虽然接口不是很全, 但是这玩意的依赖好装啊拿来开发测试还是很不错的

neon

这没啥好说的用来 rust 和 node 绑定的

编写

用 neon 创建一个新项目, 加上依赖

加载中.....

主要用的就是 ears 的 Music这个类

先创建一个 struct

加载中.....

declare_types!这个宏创建类, init函数会被翻译为constructor

加载中.....

再把其他的函数都给 export 到 JS

加载中.....

可以看到里面的获取所有权的重复代码还是很恶心的, JS 的 number 类型在 rust 里面为 f64, 但是莫得任何简单的办法直接从 f64 -> f32, 所以让 JS 传过来的String类型的值, 然后f32::from_str直接转换

由于是游戏的音频库, 所以里面有很多关于音频位置的骚玩法, 有兴趣的可以自己把里面的set_position等函数导出自己玩玩

build

加载中.....

直接运行

运行效果
Preview

很棒的 true music 🎵

还是整了一个备用方案, 打开之后启动一个 webserver, 打开浏览器链接, 在上面放一个 audio标签, 用 websocket 控制, 完全不需要做跨平台兼容 hhhhh