如何降低JavaScript中录制功能的启动延迟?
降低JS录屏与画面展示同步延迟的方案
- 预初始化媒体录制实例:不要等图片展示的同时才调用
getDisplayMedia请求权限、创建MediaRecorder实例,提前在页面加载阶段就完成权限申请、录流获取、录制器实例初始化,甚至可以先启动一个1帧的空录制预热底层编解码模块,正式触发录制的时候只需要调用start()即可,直接跳过权限请求、资源初始化的耗时。 - 用
requestAnimationFrame对齐帧时序:图片渲染和录制启动的触发都绑定到同一个requestAnimationFrame回调里执行,确保图片渲染和录制指令在同一个浏览器渲染帧内触发,最大程度减少二者的时间差。 - 关闭录制器的不必要配置:创建
MediaRecorder时,关闭冗余的音轨采样(如果不需要录系统音的话直接不传音频轨道),编码格式选浏览器原生支持最好的低延迟格式比如video/webm;codecs=vp8,不要选需要软编码的高压缩格式,同时将bitsPerSecond调整到合理区间,避免编码模块过载。 - 绕过缓冲区等待:如果用的是自定义帧录制而非原生
MediaRecorder,可以直接通过ImageCapture接口从媒体流里取帧,和页面渲染的图片做时间戳对齐,不用等编码器的缓冲区攒帧,直接输出录制数据。 - 禁用浏览器后台节流:添加对应页面配置禁止浏览器将标签页切后台时的资源节流,同时录制过程中不要执行其他高耗时JS任务,避免事件循环阻塞导致录制指令延迟执行。
Win10常规声卡设备的延迟水平
Win10系统下搭载常规集成声卡的消费级设备,在没有额外做系统级低延迟优化的场景下,JS录制的端到端延迟(从指令触发到录制正式启动的时间差)不可能达到1ms级别,常规水平在20~100ms区间,最优场景下也只能做到10ms左右的延迟。
延迟主要来自几个部分:
浏览器层面的媒体栈调度延迟:约5~20ms
系统内核层面的音频/视频流缓冲区等待:约10~50ms
编码器初始化和启动耗时:约5~30ms
如果你的场景需要同时录制音频,默认的Windows音频会话缓冲区默认是10ms起,加上声卡的AD/DA转换开销,整体延迟只会更高,不可能低于10ms。
内容的提问来源于stack exchange,提问作者C.K.
相关产品推荐
相关产品推荐

