一、简介
关于前端使用websocket播放音视频我倒是没想过,但是理论上确实是可行的,因为websocket是长连接,虽然知道web端的常见用法,但是作为c++开发人员我最疑惑的问题就是:使用js处理二进制?这个做法很不常见,恕我没太多了解,我一直以为js一般处理二进制不方便,所以脑海里一直自以为是
js编解码效率高吗?因为是基于浏览器的脚本语言的二不是直接基于系统api的独立进行,转行较多,效率应该不高,所以我也一直避讳用js去处理编解码
其实,我自以为的经过不断的探索发现也确实是对的,相对而言js确实能够处理二进制流(使用ArrayBuffer)但是操作不方便且效率相对较低,不过对于web端播放来讲,第一是播放量不太,一般不会出现9路以上主码流播放的情况(一般是一路并发),第二就是web端播放编解码其实并不是像通过c/C++那样将所有的数据一步一步解码出来,而是可以借助EMS转换工具将C库直接转换为js脚本,我们只需要用c或c++语言进行开发即可!
二、c/C++转js
我这里多说一句,我看到有将c语言直接转换为js语言的库的时候,我是一愣,这不说来所谓的前端js的音视频开发的开源库那么多,都可以使用c语言直接开发出来?因为开源的有如下问题:有些部分开源,不免费
有些有讨厌的logo,无法定制
有些有bug,并不完善
有些没有bug但是无法定制(比如延迟较高、播放长时间会变慢等疑难杂症)
如果能够用c或cpp编程开发,对于熟悉擅长这块的我岂不乐哉!于是我搜索了一下c或cpp转js的库ecmascripten
Emscripten,基于LLVM可将C/C++代码编译为js的工具。Asm.js
Asm.js来自于JavaScript应用的一个新领域:编译成JavaScript的C/C++应用。它是JavaScript应用的一个全新流派,由Mozilla的Emscripten项目催生而来。
Emscripten项目提供了可以编译C和C++(或其他任何可转换为LLVM IR的语言)代码为asm.js的工具,如下c语言代码:int (int i)
{
return i + 1;
}
Emscripten将输出下列JavaScript代码:function (i)
{
i = i | 0;
return (i + 1) | 0;
}
Emscripten目的就是将c/c++进程编译成js或者H5应用,asm.js的产生是为了提高Emscripten转换后的代码执行效率的。流程是C++ -> Emscripten -> asm.js -> 浏览器运行。
我们知道js的性能是无法跟C++这种高效语言相比的,但是Asm.js比较注意性能优化,一般情况下,对于复杂的应用Asm.js的性能仅仅比普通C++编译的慢两倍(可以和Java或者C#相媲美)。
Asm.js为了优化性能,做了一下几点:所有外部数据在一个称为堆的对象中存储并被引用。堆在本质上是一个大数组(应当是