1

我一直在编写一个接收 QVGA 视频流的浏览器插件。我想以一种可以从 JavaScript 以编程方式接口的方式将该视频流式传输到浏览器 - 例如,可以输入画布的东西,如元素或 Image() 对象。

注意:这意味着我试图避免让我的插件绘制到一个窗口中 - 我知道我可以做到这一点,但我想要与页面的其余部分呈现良好交互的东西,并且还有一个众所周知的对象模型,我不必实施。

棘手的部分是如何快速做到这一点 - 例如,我可以通过设置 src 属性来获得 base64 编码数据,但开销非常高。

我的问题是是否有办法避免更多开销(例如,提供原始图像缓冲区而不是格式化图像并对其进行 base64 编码以让浏览器对其进行解码)——我现在所拥有的还不够快。

至于环境,我正在使用 Firebreath 来编写插件(C++ 与 NPAPI/ActiveX 大部分被抽象出来),我想保留我拥有的 Mac 和 Windows 支持。直接研究使用 NPAPI 是可以接受的,但我宁愿不这样做。

编辑:我通过使用一个元素并使用数据 UI 方案将其 'src' 属性更新为 base64 编码位图解决了这个问题 - (例如 imageJSObject->SetProperty('src', 'data:image/bmp;base64,<encoded BMP>'); 性能不是很好,但已经足够了。主要的警告是,至少在 Chrome 15 上,onload 只触发一次,而不是每次我更改 src 属性时,所以我必须生成自己的事件每次更新后。

4

1 回答 1

1

没有向页面发送二进制数据的高性能方法;您大概可以使用 html5 视频标签进行流式传输,在这种情况下,您可以在插件中提供 Web 服务器源,但实际上将二进制数据发送到 javascript base64 可能是您最快的方法。

另一方面,如果您要使用无窗口插件,则必须在指示时进行绘制(您可以在 PluginWindow 上调用 InvalidateWindow 以请求重绘)并且您将绘制到 hDC 但您将参与 DOM订购。这是特定于 Windows 的;在 Mac 上,如果您使用 CoreGraphics(CoreAnimation 在某些但不是所有浏览器上)绘图,您可以做同样的事情。

至于将数据获取到 javascript,您的选择是使用套接字(以及浏览器中的某些东西从 localhost 中查询它们,例如 websockets 或 xmlhttprequest 或其他东西)或对其进行 base64 编码并将其作为字符串发送。NPAPI 中还没有二进制数据功能。

于 2011-11-19T05:41:54.467 回答