优酷播放体验优化实战(六)--Electron跨平台进阶:Native播放器融合

简介: 随着桌面应用开发技术的发展,程序的跨平台性和代码的维护成本显得尤为重要,目前优酷Windows平台采用QT作为UI的主要开发方案,DuiLib辅助一些扩展插件开发,Mac平台采用原生的Native UI开发,由于历史原因并没有将Windows端的QT框架迁移到Mac端,两端分别维护耗费不同人力。

前言

随着桌面应用开发技术的发展,程序的跨平台性和代码的维护成本显得尤为重要,目前优酷Windows平台采用QT作为UI的主要开发方案,DuiLib辅助一些扩展插件开发,Mac平台采用原生的Native UI开发,由于历史原因并没有将Windows端的QT框架迁移到Mac端,两端分别维护耗费不同人力。

 

优酷新的客户端开发采用当前主流的Electron框架,Electron框架内部采用Chromium内核实现渲染,因此我们可以整合优酷的Web平台的业务从而实现一套代码三端(Mac、Windows、Web)通用,极大的降低开发和维护成本。

 

这里有一个疑问是浏览器本身已经具备高清晰度(4K、8K)的播放能力,为什么还要做一个基于浏览器内核的客户端?原因如下:


浏览器局限性以及成本、体验

1. 优酷生产的视频从用户体验以及带宽成本等因素考虑,视频格式采用的为H.264或H.265编码格式,拿Chrome浏览器举例,持VP9和AV1但不支持HEVC(H.265)编码格式,所以浏览器想播放高清晰度(4K、8K)视频只能采用VP9或者AV1编码的视频,直接采用浏览器内核无法播放H.265编码的视频,那优酷大部分的4K视频都无法播放。

 

2. 优酷生产的视频源若进行编码格式改造成本也很高,另外Web的播放体验相比桌面应用会差一些,加上历史优酷一直都在发布桌面应用如果直接使用Web播放而去掉客户端用户也难以接受。


播放技术方案

窗口融合

在视频播放上我们需要考虑跨平台性以及开发成本,所以尽量使用Electron框架自身能力来实现播控、弹幕等基础UI部分,Native播放器仅做最基础的视频解码和渲染工作,所以要解决的关键问题是Native播放器的渲染窗口如何结合Electron创建的窗口,下文将详细介绍桌面原生窗口和Electron框架下窗口的融合过程。

 

Electron框架下创建的桌面窗口都是由BrowserWindow类来完成的,该类具备操控原生窗口的能力,通过getNativeWindowHandle方法能够拿到对应平台的窗口对象指针(Buffer),将Buffer转换为Long类型传递到C++ SDK设置父子窗口即可完成渲染窗口嵌入到BrowserWindow,API介绍如下图

截屏2021-12-10 上午11.36.35.png


JS和C++ SDK交互原理

Electron框架结合了NodeJS和Chromium,NodeJS是可以加载C++动态库的从而实现JS直接调用C++接口的能力,我们采用了Node-Addon-Api的接入体系,该体系可以按照NodeJS加载库的协议模式来编译生成C++接口层。

 

Node-Addon-Api体系采用Google的GYP编译模式,支持跨平台编译并支持编译依赖,支持生成XCode以及Vistual Studio工程等等,也可以直接使用命令行编译。

 

由于NodeJS是基于Libuv事件队列来实现异步化的,所以C++异步回调JS必须经过事件队列回调到主线程,对于频繁通信效率上可能会有一定损耗,Node-Addon-Api提供了ThreadSafeFunction来辅助实现异步接口回调,优酷客户端接口为了用户体验接口全部采用异步回调通知。

整体播放框架流程图

截屏2021-12-10 上午11.36.49.png

播放窗口实现效果图如下:

截屏2021-12-10 上午11.36.59.png

可以看到视频渲染窗口是完全嵌入到Electron提供的背景窗口上,Electron播控窗口附着于背景窗口之上。

 


Native客户端Electron客户端播放性能对比

测试机器型号及环境

CPU:Intel Core i5-6200U 2.3GHz

内存:8G

显卡:Inter HD Graphics 520

操作系统:Windows 10 64位

Electron版本:13.1.9

 

播放数据对比

截屏2021-12-10 上午11.37.09.png

测试数据上看Electron在资源占用上会比原始客户端高,但尚在可接受的范围内,测试过程中发现视频起播速度较慢,这个也是我们目前优化的重心,Electron起播慢的原因主要是窗口创建以及浏览器引擎的加载,包括Web页面的加载都比较耗时,所以导致起播速度比较慢。

 

从技术角度看我们对于起播速度优化是能够做到和Native体感保持一致的,主要是从窗口处理页面加载预处理等手段来降低首次播放的耗时,总体上Electron客户端相对原生客户端在性能上略有差距,但尚可接受。


总结

框架优缺点

优点:

Electron框架本身依赖于NodeJS的环境,在开发过程中可以很方便的依赖一些开源的npm包,利用npm包管理工具可以很好的控制依赖插件包,Electron也提供了完善的打包和自动升级体系,这方面不用耗费太大的开发经历即可实现自动升级和打包。

 

Electron利用NodeJS的Addon体系可以友好的和C++模块结合,在一些需要高性能的场景可以通过C++库来实现供JS来调用,窗口管理和托盘图标等系统相关功能Electron自身也提供一套比较完善的API,除了优秀的Web开发体系外能够很好的和桌面系统特性结合,完成开发桌面级APP的开发工作。

 

缺点:

Electron框架依赖于Chromium内核,所以采用的是多进程模式导致CPU和内存占用比较高,另外在开发过程中发现窗口创建到网页显示还是有一定延迟,针对于一些特殊场景下窗口显示等还是有一些bug,应用对机器性能要求会偏高,在低端机器上表现会稍微差一些,包括程序启动和页面加载体感不是很好。

 

思考

从开发过程中感受Electron框架体系还是非常优秀的,在众多桌面跨平台框架能够脱颖而出也提高了桌面应用拥抱Web开发体系的信心,未来机器性能不断提升的情况下,Web和Native的体验差距会变得很微弱,Electron能够提高桌面应用开发效率提供优质的应用体验,所以未来Electron可能会越来越流行。

 

在优酷新老版本升级开发中,为了提升用户体验我们一直在寻找优质的播放方案,包括对Electron自身内部实现原理的研究,最终选择了本文中的窗口融合形式,业务上能够尽量复用之前的逻辑,减少开发成本,播放上能够为用户提供Native级别的体验,后续我们将不断打磨基于Electron框架下的新版应用,为用户提供高质量的播放能力和客户端体验。



相关文章
|
1月前
|
缓存 JavaScript 前端开发
高效打造跨平台桌面应用:Electron加载服务器端JS
【9月更文挑战第17天】Electron 是一个基于 Chromium 和 Node.js 的开源框架,允许使用 HTML、CSS 和 JavaScript 构建跨平台桌面应用。加载服务器端 JS 可增强应用灵活性,实现代码复用、动态更新及实时通信。通过 HTTP 请求、WebSocket 或文件系统可实现加载,但需注意安全性、性能和兼容性问题。开发者应根据需求选择合适方法并谨慎实施。
|
4月前
|
资源调度 JavaScript 前端开发
IM跨平台技术学习(十一):环信基于Electron打包Web IM桌面端的技术实践
这次借着论证 Web IM端 SDK 是否可以在 Electron 生成的桌面端正常稳定使用,我决定把官方新推出的 webim-vue3-demo,打包到桌面端,并记录了这次验证的过程以及所遇到的问题和解决方法。
86 2
|
4天前
|
开发框架 JavaScript 前端开发
Electron技术深度解析:构建跨平台桌面应用的利器
【10月更文挑战第13天】Electron技术深度解析:构建跨平台桌面应用的利器
17 0
|
2月前
|
容器 iOS开发 Linux
震惊!Uno Platform 响应式 UI 构建秘籍大公开!从布局容器到自适应设计,带你轻松打造跨平台完美界面
【8月更文挑战第31天】Uno Platform 是一款强大的跨平台应用开发框架,支持 Web、桌面(Windows、macOS、Linux)及移动(iOS、Android)等平台,仅需单一代码库。本文分享了四个构建响应式用户界面的最佳实践:利用布局容器(如 Grid)适配不同屏幕尺寸;采用自适应布局调整 UI;使用媒体查询定制样式;遵循响应式设计原则确保 UI 元素自适应调整。通过这些方法,开发者可以为用户提供一致且优秀的多设备体验。
86 0
|
2月前
|
前端开发 JavaScript API
强强联手打造桌面应用新标杆:Angular与Electron的完美融合——从环境搭建到通信机制,全面解析构建跨平台应用的最佳实践与技巧
【8月更文挑战第31天】随着Web技术的进步,开发者们越来越多地采用Web技术来构建桌面应用程序。通过结合使用开源框架Electron及前沿的前端框架Angular,开发者能充分利用JavaScript、HTML和CSS打造出高性能且易维护的跨平台桌面应用。本文将详细介绍如何搭建基于Angular与Electron的开发环境,包括创建Angular项目、安装Electron及相关依赖、配置Electron主进程以及实现Angular应用与Electron间的通信等关键步骤,并最终将应用打包成多平台可执行文件,为读者提供了一套完整的解决方案以快速入门并实践这一强大技术组合。
47 0
|
3月前
|
Rust 前端开发 JavaScript
IM跨平台技术学习(十三):从理论到实践,详细对比Electron和Tauri的优劣
本文主要介绍了目前比较流行的桌面应用跨平台开发技术及其架构,并以实战的方式对比了 Electron 和 Tauri 的优势和劣势,以及桌面跨平台应用开发的技术趋势。
56 0
|
5月前
|
API CDN
Electron Markdown编辑器实战:资源管理器实现
Electron Markdown编辑器实战:资源管理器实现
|
5月前
|
前端开发 数据可视化 iOS开发
基于electron快速将任意网站打包成跨平台的桌面端软件
基于electron快速将任意网站打包成跨平台的桌面端软件
173 1
|
5月前
|
Rust 前端开发 JavaScript
IM跨平台技术学习(十):快速对比跨平台框架Electron、Flutter、Tauri、React Native等
在本文中,我们将比较五种流行的桌面应用程序开发框架:Electron、Flutter、Tauri、React Native 和 Qt,希望可以帮助你根据项目需求做出明智的技术选型决策。
431 2
|
5月前
|
存储 Web App开发 iOS开发
Electron 从基础到实战笔记 - Electron App对象及其事件
Electron 从基础到实战笔记 - Electron App对象及其事件
214 0