在网页上用websocket播放RTSP实时流 性能优化 进阶方案

需求: 使用websocket在网页上展示实时视频流

最近发现有的网站上,显示的视频流很丝滑,而且在多路情况下不会出现页面卡死。 总结了一下所使用的技术。

之前的处理

后端推消息,把数据转为json字符串,通过websocket推给前端, 图片使用base64编码

{
"channel": "camera_1",
"url": "data:image/png;base64,iV"
}

前端接收到数据后,解码,使用img 标签展示 图片base64

优化处理

客户端的传输方式改为 ArrayBuffer方式。将channel、图片文件流等信息拼接为二进制数据。 通过websocket推送给前端
举例:
channel频道: camera_1 占两个字节;
图片: file文件流 占128字节
字节顺序 Little-endian

前端读取为ArrayBuffer, 通过视图操作,取出图片的二进制流,生成Blob对象
读取blob对象, 返回 URL格式的字符串(base64编码)以表示所读取文件的内容
前端img 标签 src 赋值为 base64 字符串,显示视频流图片。

优点:

  1. 将二进制数据转成Base64编码,再进行处理。 不仅速度慢,而且容易出错。 Blob对象,允许直接操作二进制数据。
  2. javaScript 通信的时有大量的实时的数据交互,用文本格式需要进行格式转化,二进制则省去转化时间
  3. 前端ArrayBuffer 分配一段可以存放数据的连续内存区域,有垃圾回收机制。ArrayBuffer对象代表储存二进制数据的一段内存,它不能直接读写,只能通过视图DataView进行操作。
    优化了客户端浏览器性能,防止出现页面卡死的情况。
  4. ArrayBuffer的创建速度几乎是Array的四倍以上;读操作快了一倍。另外IE相比Chrome简直慢成鬼了。看来不同配置,不同浏览器差别还是非常大的
  5. 二进制相比base64, 数据大小减小了 三分之一。 img标签则会找到相应的内存地址,直接读取数据并将图像显示到页面中。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 转载自 那些年,被blob虐过的程序猿觉醒了[https://mp.weixin.qq.com/s/oXc31L5...
    liwuwuzhi阅读 876评论 0 5
  • 在javascript的世界里无法处理二进制数据,如果需要处理,只能使用charCodeAt()方法,一个个字节地...
    我是上帝可爱多阅读 1,078评论 0 4
  • 文件操作一直是早期浏览器的痛点,全封闭式的不给JavaScript操作的空间。随着H5新接口的推出这个壁垒被打破了...
    JunChow520阅读 1,666评论 0 2
  • 前言 HTML5 中提供的文件API在前端中有着丰富的应用,上传、下载、读取内容等在日常的交互中很常见。而且在各个...
    linshuai阅读 937评论 0 11
  • 我们在平时工作中常常会遇到文件上传的需求。但许久以来大多数人都是直接使用一些框架自带的组件去实现,对于一些复杂的上...
    SophieRabbit阅读 3,488评论 0 1

友情链接更多精彩内容