我一直在编写一个接收QVGA视频流的浏览器插件。我想以一种可以通过编程方式从JavaScript连接的方式将该视频流式传输到浏览器 - 例如,可以将某些内容输入到画布中,例如元素或Image()对象。
注意:这意味着我试图避免将我的插件绘制到窗口中 - 我知道我可以这样做,但我希望能够与页面的其余部分进行良好的交互并且还有一个众所周知的对象我不必实施的模型。
棘手的部分是如何快速完成 - 我可以通过设置src属性来获得base64编码数据,但开销非常高。
我的问题是,是否有办法避免更多的开销(例如,提供原始图像缓冲区而不是格式化图像和base64编码只是为了让浏览器解码它) - 我现在所拥有的并不快够了。
至于环境,我正在使用Firebreath来编写插件(带有NPAPI / ActiveX的C ++主要被抽象掉了),我想保留我拥有的Mac和Windows支持。深入研究直接使用NPAPI是可以接受的,但我宁愿不这样做。
编辑:我通过使用元素并使用数据UI方案将其'src'属性更新为base64编码的位图来解决问题 - (例如imageJSObject-> SetProperty('src', 'data:image / bmp; base64,< encoded BMP>'); 性能不是很好,但它足够好。主要的警告是,至少在Chrome 15上,onload只被触发一次,而不是每次我更改src属性时,所以我必须在每次更新后生成我自己的事件。
答案 0 :(得分:1)
没有高性能的方法可以将二进制数据发送到页面;您可以使用html5视频标签进行流式传输,在这种情况下,您可以在插件中提供Web服务器源,但实际上将二进制数据发送到javascript base64可能是您最快的方法。
另一方面,如果您要使用无窗口插件,则必须在指示时绘制(您可以在PluginWindow上调用InvalidateWindow来请求重绘)并且您将绘制到hDC但是您已参与在DOM排序中。这是特定于Windows的;在Mac上你可以做同样的事情,如果你用CoreGraphics绘制(CoreAnimation在一些但不是所有的浏览器上)。
关于将数据转换为javascript,您的选择是使用套接字(以及浏览器中的某些东西从localhost查询它们,例如websockets或xmlhttprequest等)或base64对其进行编码并将其作为字符串发送。 NPAPI中还没有二进制数据功能。