webRTC基础--视频编解码


视频压缩

视频编/解码其实就是一个视频压缩与解压缩的过程。原始数字视频数据量巨大,未经压缩不管是传输还是存储上都是不大现实的。

压缩原理

视频可以压缩,因为它有冗余。

  1. 空间冗余:图像相邻像素之间有较强的相关性
  2. 时间冗余:视频序列的相邻图像之间内容相似
  3. 编码冗余:不同像素值出现的概率不同
  4. 视觉冗余:人的视觉系统对某些细节不敏感
  5. 知识冗余:规律性的结构可由先验知识和背景知识得到

    Read More

webRTC基础篇-ice


ICE

webRTC采用p2p的方式数据传输。由于NAT的存在破坏了IP端到端通信的能力,使得我们需要一些手段去找到隐藏在NAT和防火墙之后的浏览器(peer),即NAT穿透。ICE是这样的传输协议之一。

基本的ICE流程

  1. 两个浏览器通过自己的公网IP地址,使用STUN协议信息和STUN服务器建立联系;
  2. 两个浏览器通过SDP提供/应答机制,使用呼叫控制信令消息交换它们已发现的公共IP地址(ICE候选);
  3. 两个浏览器执行连接检查(ICE冲孔),确保P2P可以连接;
  4. 建立连接后,RTC媒体会话和媒体交换就可以实现了。
  5. 假如在一个高度限制的NAT或防火墙,这种直接的路径将无法建立,只能到达TURN服务器。结果是媒体通过TURN服务器分程传递。

    Read More

webRTC基础--NAT


NAT

20多年前,Internet的基础协议Ipv4地址即将耗尽,而每天需要入网的设备成指数增长,数以亿计的设备上网问题需要解决。NAT(Network Address Translation) – 网络地址转换,一种几乎让ipv4起死回生的技术。

通常NAT通署在网络的出口,通过替换IP报文头部信息,将内部网络IP地址转换成出口IP地址提供与公网联接的能力。简单的来说就是把一个内部网络所有的请求都通过NAT发送与接收,以达到一个内部网络只使用一个或少个ip地址就能与Internet通信的目的。图示如下
概念图

NAT的几个关键特点

  1. 网络被分为私网和公网两个部分,NAT网关设置在私网到公网的路由出口位置,双向流量必须都要经过NAT网关;
  2. 网络访问只能先由私网侧发起,公网无法主动访问私网主机;
  3. NAT网关在两个访问方向上完成两次地址的转换或翻译,出方向做源信息替换,入方向做目的信息替换;
  4. NAT网关的存在对通信双方是保持透明的;
  5. NAT网关为了实现双向翻译的功能,需要维护一张关联表,把会话的信息保存下来。

    Read More

webRTC基础--音视频


视频基础

我们平常笼统说的「视频格式」其实包含三个部分:视频编码、音频编码、容器格式。

我常所说的.mkv、.mp4、.webm指的是视频文件的容器格式。字面上理解就是他是一个存放视频编码、音频编码的一个容器,再通过特定的方式和规律组织起来,最后呈现给我们一个正常的音画同步的视频播放效果。比如说最常见的 .mp4 文件通常存放的就是H.264编码的视频流和 AAC 编码的音频流。通常,一个容器格式可以包含不同编码格式的音视频流;同样编码的音视频流也可以

VP8/9 与 H264/H265视频编码

VP8与 H264视频编码是目前webRTC支持的两种视频格式(VP9是VP8的最新标准,H265是H264的最新标准)。

Read More

前端优化-渲染优化四-管道-合成

前端优化-管道-合成

并非所有的样式修改代价都是平等的。它们可能会触发布局或者绘制合成、可能只触发绘制与合成、也可能只触发合成。合成指的是合成层。

分层

浏览器绘制是分层的,就像photoshop。 如果你接触过photoshop,应该会了解图层这个概念。设计一张psd设计稿往往会有很多图层。一来是方面分组管理。二来,如果把所有东西都绘制到一张图层上,那么后期修改就会非常痛苦。你修改一处地方可能会影响其他部分或者全部内容。如果你是设计师也不希望每一次修改都要重新绘制一次对吧。
举个例子:左侧滑出菜单是我们平时非常常见也非常实用的一个功能。如果只有一个层,那么菜单滑出的时候,影响了内容区域的布局,导致整个区域的layout、paint。往往我们会给菜单加上动画。现在,我们得到了一个1秒60帧的卡顿,只有高端设备才能流畅的完成这个行为。

如果我们把菜单和内容分成两个层。左侧菜单滑出的时候,仅绘制菜单层,那么内容层便不受影响。仅仅这样我们便得到了很大的性能提升,内容层无需被layout、point了。

分层真是太棒了。

Read More

前端优化-渲染优化二-管道-javascript

渲染优化二–管道–javascript

你写的javascript代码并非就是浏览器执行的代码,现在浏览器引擎会重新编译你写的代码从而使代码运行速度更快。这个过程是通过即时编译器(Just In Time)完成的,简称JIT。JIT会在javascript运行过程中一点一点的优化代码,这是一个复杂又庞大的系统。对于 开发者我们不可能知道jit实际会运行什么代码。

mrale.ph

mrale.ph 是一个在线网站,你可以查看JIT编译前后的代码。mrale.ph自己提供了一些demo,当然你也可以上传自己的代码。(截图里样式出现了一些问题,可能是我ss的问题)。你可以点击IR、Srouce来切换javascript代码和jit编译后的代码。甚至还提供了graph图解。你不需要理解jit代码,这只是chrome和其他v8引擎理解你写的js代码。我们在写代码的时候应该避免微优化,即不该写出自认为会让浏览器稍微更快速的运行的代码。因为我们不可能知道浏览器会如何处理这些代码,所以没有必要猜测。我们应该通过其他方式提高性能,不是把精力浪费在微优化之上。

Read More

前端优化-移动设备的性能分析

在移动设备上调试网页

浏览器可以模拟相关设备的分辨率、像素比、网络、cpu情况等。在很多时候,我们还是会在某些设备上碰到一些性能、渲染或其他问题需要真机调试。

准备工作

我们可能需要做一些准备

  • 一台安卓设备
  • 一根usb连接线
  • 在你的pc上安装chrome浏览器
  • 在你的安卓设备上安卓chrome浏览器

开发者模式

拿出我们的安卓设备,我们需要开启设备的开发者模式。进入设置–系统设置–关于手机,点击版本号7次开启开发者模式。不同的手机可能进入路径不同,请看设备说明书或者网络搜索。

Read More

前端优化-开始性能优化

开始性能优化吧

现在我们已经明白性能的重要性,也明白了浏览器大概的渲染过程,是时间拿起我们的工具来优化我们的应用了。

chrome devTools

chrome devTools 是google 推出的 chrome 浏览器上的开发工具,它非常流行。你可以使用快捷键 mac(Cmd+alt+j)、windows(ctrl+shift+i 或 f12) 打开它。它可能长这样
chrome 全貌

Read More