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