broadway和libspeex的C代码可以先编译成llvm的中间文件,然后再和自己写的c++代码连接形成最终的js代码。
中间遇到的问题是,如何在C代码和js代码之间进行交互,就是哪些代码写成C,哪些用js实现。
用emscripten绑定两个C++类,NetConnection,NetStream,以实现通讯解码等高密度运算,调用方式基本模仿as。
在调用js系统自带的一些对象的时候,从C端调用会有一些性能影响,尤其是传递大对象的时候,这时候通过阅读speex.js的一些用法发现,C代码的内存使用,emscripten会分配一块ArrayBuffer,在js端可以通过将C端的指针看成是ArrayBuffer的偏移来直接操作内存,这样就可以高效管理内存。需要传递大数据的时候,只需要传递指针(即偏移)到js代码中,js就能获取到内存数据。
使用方法和as十分接近。
var nc = null; var ns = null; function test() { nc = new NetConnection(); nc.onNetStatus = function(info) { Module.print(info.code); if (info.code == "NetConnection.Connect.Success") { ns = new NetStream(nc); ns.attachCanvas(document.getElementById("canvas")); ns.initAudio(50); } } nc.connect("192.168.0.100:1936", "live", ""); }
ns.initAudio(50);这段代表音频缓冲50帧播放,因为实际测试发现,不缓冲的话声音播放不出来
目前经过压缩整体js在500k左右