近年来,视频直播、直播带货、在线教育、在线医疗等音视频领域的相关行业都非常热门,成为大众瞩目的焦点。

在不久的将来,音视频技术渗透于各行各业,无处不在。从IoT网络到个人用户的移动设备,音视频技术以不同的形态广泛存在各个终端和应用平台。因此,实现跨平台的应用开发就显得非常重要,一套代码多平台适用,跨平台开发降低了工程师的工作量,让产品快速迭代。

本文将介绍如何通过Electron构建桌面跨平台音视频应用。

一、桌面音视频应用开发难度大,跨平台开发变得流行

过去开发一个桌面的视频应用,通常首选开发语言是C++。桌面UI框架一般选择QT、MFC自绘、Duilib、SoUI或者付费的UI库等,但是无论哪种框架,都有很大的局限性。要么是不跨平台,要么是使用的门槛高,要么是本身表现不好,要么就是不太稳定导致开发过程中还需要踩很多坑。可以说C++做桌面应用开发时,UI框架的选择是比较困难的。

随着前端技术发展的不断革新,各种前端框架的不断涌出,桌面应用越来越多的向web靠近,利用前端的技术来实现桌面应用的UI跨平台变得越来越流行。

Electron 技术的出现,让开发者可以使用 JavaScript, HTML 和 CSS 构建跨平台的桌面应用,基于Electron构建的应用兼容 Mac、Windows 和 Linux等多系统,摆脱了不同浏览器之间的差异和版本限制。VS Code就是一款向世人展示Electron技术能力的优秀桌面应用程序。

二、通过WebRTC构建桌面应用的局限

Electron采用的是Chrome内核来做前端渲染,基于Chrome谈音视频,如果要用开源的音视频方案,现在最流行的就是WebRTC了。

基于WebRTC技术,可以实现简单的视频一对一通话场景。Google的推荐解决方案支持视频p2p通话以及服务器转发,开发者基本只需研发信令方面的内容,在服务器端几乎可以不做任何开发,可以说是一个比较完善成熟的解决方案。

然而目前的实时音视频应用,绝不仅限于简单的视频一对一通话。像视频预处理加个美颜、声音做个变声或者直播时放个背景音乐等等看似很普通很合理的需求,如果直接使用WebRTC方案,从目前看都几乎很难实现。音视频领域有种流行说法:从demo到产品,中间还差1万个WebRTC。虽说略为夸张,但却反映了使用WebRTC的过程中,还有非常多音视频专业问题需要解决。

仅仅只通过WebRTC来实现一款优秀的实时音视频产品,想法过于简单。音视频领域涉及到非常多的专业内容,即便是做个简单demo也不是几行代码就可以完成的,在实际产品开发中,通过信令交换sdp、candidate以及处理时序等各环节,都需要开发者小心翼翼去实现,才能够完成视频的联通。

三、即构推出Electron平台SDK,实现高性能优化

音视频产品跨平台开发的重要性在逐步凸显,即构科技作为专业的实时语音视频云服务商,推出基于Electron平台的SDK,让开发者通过调用即构SDK即可实现跨平台应用的快速构建。ZEGO Electron SDK基于Electron C++的拓展插件调用即构原生sdk实现,并对js与原生sdk交互进行优化实现高性能。

ZEGO Electron SDK主要的优化内容有:

1、减少js代码处理视频数据的机会。即构使用js和c++共享内存方式进行处理,处理视频帧数据全部在c++层代码,js层只负责把这块内存数据输送到显卡内存,通过webgl来渲染。

2、优化视频渲染性能。即构利用V-Sync技术进行渲染,有效解决多路视频情况下的渲染性能问题。

通过Zego Electron SDK,不但获得强大的原生平台音视频能力,而且还能极大的降低开发门槛,大幅度提高开发效率。

四、4步搭建桌面跨平台音视频应用

基于Zego Electron SDK,通过简单的4个函数,就能实现视频的发送和接收。

第一,初始化SDK。通过ZEGO官网控制台申请的AppId和AppSign初始化sdk即可。

第二,登录房间。初始化sdk成功后,用户自己指定一个房间id就可以进行登录房间了。

第三,音视频推流。登录成功后,只通过一个推流函数,自定义一个推流id就可以把本地的摄像头实时数据推到ZEGO的服务器。

第四,音视频拉流。通过一个拉流函数,指定拉流的流id进行拉流,就可以把ZEGO服务器上的视频流拉到本地进行显示。

简单四步,开发者可轻松构建一个桌面跨平台应用,实现实时音视频数据的发送和接收。通过Zego Electron SDK 实现的音视频应用,还能与Zego的其它平台SDK,如Android、iOS、Web js(webrtc版)、微信小程序、window(c++、c#)、Mac等互通,进一步降低跨平台开发的工作量。

Zego Electron SDK集成文档请点击:

https://doc-zh.zego.im/zh/2193.html

示例源码请点击:

https://github.com/zegoim/zego-electron-quick-start

关于音视频行业的跨平台开发技术,欢迎留言与我们交流。

(内附示例源码)如何通过electron构建桌面跨平台音视频应用的更多相关文章

  1. java小项目之:植物大战僵尸,这个僵尸有点冷!内附素材源码

    Java小项目之:植物大战僵尸! <植物大战僵尸>是由PopCap Games开发的一款益智策略类单机游戏,于2009年5月5日发售,这款游戏可谓是无人不知无人不晓. 在我身边,上到40岁 ...

  2. vlc源码分析(五) 流媒体的音视频同步

    vlc播放流媒体时实现音视频同步,简单来说就是发送方发送的RTP包带有时间戳,接收方根据此时间戳不断校正本地时钟,播放音视频时根据本地时钟进行同步播放.首先了解两个概念:stream clock和sy ...

  3. Visual Studio 2015开发Qt项目实战经验分享(附项目示例源码)

    Visual Studio 2015开发Qt项目实战经验分享(附项目示例源码)    转 https://blog.csdn.net/lhl1124281072/article/details/800 ...

  4. 在WebBrowser中执行javascript脚本的几种方法整理(execScript/InvokeScript/NavigateScript) 附完整源码

    [实例简介] 涵盖了几种常用的 webBrowser执行javascript的方法,详见示例截图以及代码 [实例截图] [核心代码] execScript方式: 1 2 3 4 5 6 7 8 9 1 ...

  5. winserver的consul部署实践与.net core客户端使用(附demo源码)

    winserver的consul部署实践与.net core客户端使用(附demo源码)   前言 随着微服务兴起,服务的管理显得极其重要.都知道微服务就是”拆“,把臃肿的单块应用,拆分成多个轻量级的 ...

  6. 单独编译和使用webrtc音频降噪模块(附完整源码+测试音频文件)

    单独编译和使用webrtc音频增益模块(附完整源码+测试音频文件) 单独编译和使用webrtc音频回声消除模块(附完整源码+测试音频文件) webrtc的音频处理模块分为降噪ns,回音消除aec,回声 ...

  7. 用Assert(断言)封装异常,让代码更优雅(附项目源码)

    有关Assert断言大家并不陌生,我们在做单元测试的时候,看业务事务复合预期,我们可以通过断言来校验,断言常用的方法如下: public class Assert { /** * 结果 = 预期 则正 ...

  8. Tyrion中文文档(含示例源码)

    Tyrion是一个基于Python实现的支持多个WEB框架的Form表单验证组件,其完美的支持Tornado.Django.Flask.Bottle Web框架.Tyrion主要有两大重要动能: 表单 ...

  9. 安卓图表引擎AChartEngine(三) - 示例源码折线图、饼图和柱状图

    折线图: package org.achartengine.chartdemo.demo.chart; import java.util.ArrayList; import java.util.Lis ...

  10. Asp.Net Web Api 2 实现多文件打包并下载文件示例源码_转

    一篇关于Asp.Net Web Api下载文件的文章,之前我也写过类似的文章,请见:<ASP.NET(C#) Web Api通过文件流下载文件到本地实例>本文以这篇文章的基础,提供了Byt ...

随机推荐

  1. Smt贴片换料口诀及注意事项

    Smt贴片换料口诀及注意事项 一.Smt贴片送料口诀 1.若飞达没料,机器报警,操作员根据机器的提示消警 2.取出缺失飞达料,把用完的料盘取下 3.把备好的物料与换下来的料盘核对,确认无误装飞达 4. ...

  2. Flask 上下文是什么 ?

    哈喽大家好,我是咸鱼.今天我们来聊聊什么是 Flask 上下文   咸鱼在刚接触到这个概念的时候脑子里蹦出的第一个词是 CPU 上下文 今天咸鱼希望通过这篇文章,让大家能够对 Flask 上下文设计的 ...

  3. Simulation-计算统计——Monte Carlo

    Monte Carlo Integration 找到原函数,再计算 无法找到原函数,MC积分 Assume that we can generate \(U_1, . . . , U_n \sim U ...

  4. Rust中的宏:声明宏和过程宏

    Rust中的声明宏和过程宏 宏是Rust语言中的一个重要特性,它允许开发人员编写可重用的代码,以便在编译时扩展和生成新的代码.宏可以帮助开发人员减少重复代码,并提高代码的可读性和可维护性.Rust中有 ...

  5. [Pytorch框架] 2.1.3 神经网络包nn和优化器optm

    文章目录 PyTorch 基础 : 神经网络包nn和优化器optm 定义一个网络 损失函数 优化器 PyTorch 基础 : 神经网络包nn和优化器optm torch.nn是专门为神经网络设计的模块 ...

  6. spring xml配置中引用java配置不能用ClassPathXmlApplicationContext

    现在的目的是想测试在xml配置中引用java配置的bean CD唱片的接口: package v4.c2; public interface CompactDisc { void play(); } ...

  7. 粘包/拆包问题一直都存在,只是到TCP就拆不动了。

    OSI open-system-Interconnection TCP/IP 5层协议栈 应用层和操作系统的边界是 系统调用 ,对应到网络编程是socket api TCP/UDP 概况 TCP粘包问 ...

  8. HTML中meta标签的那些属性

    <meta> 标签是 HTML 中用于描述网页元信息的元素.它位于 <head> 部分,不会显示在页面内容中,但对于浏览器.搜索引擎等具有重要作用.主要作用有:定义文档的字符编 ...

  9. 2021-03-31:给定一个数组arr,给定一个值v。求子数组平均值小于等于v的最长子数组长度。

    2021-03-31:给定一个数组arr,给定一个值v.求子数组平均值小于等于v的最长子数组长度. 福大大 答案2021-03-31: 这道题是昨天每日一题的变种.数组每个元素减v,然后求<=0 ...

  10. 2022-03-06:金币路径。 给定一个数组 A(下标从 1 开始)包含 N 个整数:A1,A2,……,AN 和一个整数 B。 你可以从数组 A 中的任何一个位置(下标为 i)跳到下标 i+1,i+

    2022-03-06:金币路径. 给定一个数组 A(下标从 1 开始)包含 N 个整数:A1,A2,--,AN 和一个整数 B. 你可以从数组 A 中的任何一个位置(下标为 i)跳到下标 i+1,i+ ...