使用JS实现RTMP协议直播(三)

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左右

你可能感兴趣的:(JavaScript,RTMP,emscripten)