11月7日,即构和上海GDG技术社区联合举办了实时音视频技术云上技术分享专场,来自即构科技和Bilibili的资深技术专家进行了深度分享。大会吸引了500+开发人员交流、观看,并在活动过程中与分享嘉宾进行了热烈互动,下面我们将整理嘉宾们分享的核心内容,错过活动直播的小伙伴可以继续观看学习。

本文是即构科技李展鹏带来的主题为《Flutter实时音视频应用场景实践》的技术分享。以下为主要的分享内容:

大家好,我是来自即构科技的李展鹏,目前负责参与即构音视频平台SDK的建设工作。本人从内测版本开始接触Flutter,较早开始处理Flutter应用于音视频业务的场景,今天我将和大家一起交流一下Flutter在实时音视频场景下的应用实战。

一、Flutter系统架构

首先,给大家简单介绍一下 Flutter 的整体架构。大家可以看下面这张图:

图中绿色区域是基于 Dart 语言的framework层,包含两大类UI样式、控件、动画、手势等等,是Flutter开发者们直接对接的一层。

蓝色区域则为 Flutter 的引擎层,使用C++实现,这一层是Flutter实现跨平台的关键所在。核心模块主要包括与原生交互的Channel机制、 skia 图形渲染框架,还有Dart 虚拟机等等。

橙色区域主要是一些平台特定模块。就算 Flutter 拥有跨平台的特性,但底层还是离不开原生的支持。当某些特定功能无法直接使用 Flutter 实现时,那么开发者还可以通过编写原生插件的形式进行支持。即构在Flutter中实现音视频服务也是主要从这一层进行切入。

基于这张图,我们大概可以看出Flutter的一些优缺点。

优点

Flutter的优点是跨平台,拥有双端一致的体验,性能强大;基于自研引擎渲染,易于上手。Dart 语言当初用于对标 JS 语言,在设计上更靠近脚本语言风格,相比于原生语言来说更加容易入门。

缺点

Flutter 作为一个相对来说比较新兴的框架,相比于其他框架来说避免不了存在生态不完善的问题。不少功能还需要开发者自己造轮子,使用原生语言进行双端开发。

另外,Flutter 在 Github 上的 issue 相对较多,存在较多的已知bug。例如,在音视频场景下,视频渲染这块的优化问题相比原生还是稍微逊色一些,但是其实我们可以看到 Flutter 团队一直都在积极修复各种问题,我们相信未来在稳定性方面一定会越来越好。

二、Flutter 实时音视频快速接入

即构作为专业的音视频云服务商,我们很早就开始了对Flutter技术框架的研究,下面我们来介绍 Flutter 实时音视频的快速接入。即构SDK快速接入流程包括以下几点,初始化SDK、登录房间服务器、用户推送自己的本地音视频流,然后拉取远端的音视频流。

感兴趣的开发者可以扫码体验 Express Flutter SDK,里面会有比较详细的接入指南和示例demo。

我们看到,当我们需要使用即构Flutter SDK 的时候,需要在工程根目录下的配置文件里,添加 zego_engine_engine 的依赖声明,然后通过运行 flutter pub get 的命令,即可从远端pub仓库把SDK下载下来。

在图示的代码里,我们可以看到使用即构 Flutter SDK进行快速接入主要包括以下几步。

第一步,初始化SDK,这个步骤先要从即构官网上申请唯一专属的App ID 和App sign。

第二步,登录房间。

第三步,推送本地音视频流。在推流前如果需要对视频流进行本地预览,那么还需要使用即构 SDK 基于 Flutter 提供的外接纹理模块封装好的接口,创建一个视频纹理渲染对象,获取一个 textureID。

拿到 textureID 后,通过使用 Flutter 提供的 Texture 控件,即可进行本地播放。

在这里,Flutter 对音视频场景提供了两种视频渲染方案,分别是 Texture 和 Platform View。即构同时提供两种渲染方案的接口,但基于兼容性和稳定性考虑,我们更推荐开发者使用 Texture 方案。

然后,拉流的步骤和推流类似,在这里不重复赘述。

到这里,开发者就可以实现简单的实时音视频场景了。

三、Flutter自定义视频采集方案

视频采集是整条实时音视频链路中的起点。即构SDK内置了对摄像头的视频采集,可以直接将采集到的数据进行编码推流。

但若开发者需要在采集环节进行一些定制化操作,如,采集完摄像头原始数据后还需要对接第三方的美颜前处理;或者应用场景中有多种不同的输入源,如屏幕分享、播放一段视频推流等,那么就需要使用到自定义视频采集功能。

下图是Native 框架下自定义视频采集的实现框架:

那么,Flutter框架下是否可以沿用相同的方案呢?

篇幅原因,Flutter实时音视频应用场景实践分享的后半部分:Flutter自定义视频采集方案以及Flutter的屏幕分享实战内容,大家可以通过活动资料包查看,资料包中还包括嘉宾的演讲PPT以及视频回放,扫描下方二维码即可获取活动资料包:

活动回顾:Flutter实时音视频应用场景实践的更多相关文章

  1. 了不起的WebRTC:生态日趋完善,或将实时音视频技术白菜化

    本文原文由声网WebRTC技术专家毛玉杰分享. 1.前言 有人说 2017 年是 WebRTC 的转折之年,2018 年将是 WebRTC 的爆发之年,这并非没有根据.就在去年(2017年),WebR ...

  2. 从零到一,使用实时音视频 SDK 一起开发一款 Zoom 吧

    zoom(zoom.us) 是一款受到广泛使用的在线会议软件.相信各位一定在办公.会议.聊天等各种场景下体验或者使用过,作为一款成熟的商业软件,zoom 提供了稳定的实时音视频通话质量,以及白板.聊天 ...

  3. 声网Agora 实时音视频服务正式上线 HTC VIVE Sync App,支持非 VR 用户

    全球实时互动云服务开创者和引领者声网Agora(纳斯达克股票代码:API)宣布其视频 SDK 现已集成到领先的 VR/XR 远程协作及会议应用 HTC VIVE Sync App 中. 通过集成声网A ...

  4. Qcon 实时音视频专场:实时互动的最佳实践与未来展望

    互动直播.线上会议.在线医疗和在线教育是实时音视频技术应用的重要场景,而这些场景对高可用.高可靠.低延时有着苛刻的要求,很多团队在音视频产品开发过程中会遇到各种各样的问题.例如:流畅性,如果在视频过程 ...

  5. 如何基于 ZEGO SDK 实现 Flutter 一对一音视频聊天应用?

    之前的文章发布了ZEGO SDK实现Android端音视频通话应用的开发教程,不少开发者反馈很实用,能不能也出一版Flutter的教程. 有求必应,这不小编来了- 我们封装了ZEGO Flutter ...

  6. 实时音视频互动系列(上):又拍云UTUN网络详解

    如何定义实时音视频互动, 延迟 400ms 内才能无异步感 实时音视频互动如果存在1秒左右的延时会给交流者带来异步感,必须将视频播放延迟限制在400ms以内,才能给用户较好的交互体验. 当延迟控制在4 ...

  7. 实时音视频互动系列(下):基于 WebRTC 技术的实战解析

    在 WebRTC 项目中,又拍云团队做到了覆盖系统全局,保证项目进程流畅.这牵涉到主要三大块技术点: 网络端.服务端的开发和传输算法 WebRTC 协议中牵扯到服务端的应用协议和信令服务 客户端iOS ...

  8. 融云携新版实时音视频亮相 LiveVideoStack 2019

    4 月 19 日,LiveVideoStack 2019 音视频大会在上海隆重开幕,全球多媒体创新专家.音视频技术工程师.产品负责人.高端行业用户等共襄盛会,聚焦音频.视频.图像.AI 等技术的最新探 ...

  9. 小程序升级实时音视频录制及播放能力,开放 Wi-Fi、NFC(HCE) 等硬件连接功能

    “ 小程序升级实时音视频录制及播放能力,开放 Wi-Fi.NFC(HCE) 等硬件连接功能.同时提供按需加载.自定义组件和更多访问层级等新特性,增强了第三方平台的能力,以满足日趋丰富的业务需求.” 0 ...

  10. BBR在实时音视频领域的应用

    小议BBR算法 BBR全称Bottleneck Bandwidth and RTT,它是谷歌在2016年推出的全新的网络拥塞控制算法.要说明BBR算法,就不能不提TCP拥塞算法. 传统的TCP拥塞控制 ...

随机推荐

  1. Linux(三)磁盘管理

    Linux磁盘管理 Linux中的tree工具 tree可以查看目录的树形结构,前提是需要自行安装 yum install tree -y [root@hadoop100 ~]# tree ./ ./ ...

  2. 【Vue项目】尚品汇(六)ShopCar组件开发 购物车模块

    4 购物车 4.1 购物车商品数量控制 Detail\index.vue <div class="cartWrap"> <div class="cont ...

  3. 【深入浅出Spring原理及实战】「源码调试分析」深入源码探索Spring底层框架的的refresh方法所出现的问题和异常

    学习Spring源码的建议 阅读Spring官方文档,了解Spring框架的基本概念和使用方法. 下载Spring源码,可以从官网或者GitHub上获取. 阅读Spring源码的入口类,了解Sprin ...

  4. springboot自动装配大概原理

    自动装配: pom.xml spring-boot-dependence:核心都依赖在父类工程中! 我们在写入或者引入springboot依赖的时候,不需要指定版,因为有这些仓库的版本 启动器:--- ...

  5. 分享一下.net core mvc的ModelStateExtend

    主要代码: using Cracker.Core.Function; using Microsoft.AspNetCore.Mvc.ModelBinding; namespace Cracker.Co ...

  6. Prism Sample 20-NavigateToExistingViews

    上一个例子介绍了INavigationAware中的OnNavitationTo,这次是第二个实现函数. IsNavitationTarget,这个名字有点误导,真实的作用是,当从其它页面导航至本页面 ...

  7. 一文快速入门体验 Hibernate

    前言 Hibernate 是一个优秀的持久层的框架,当然,虽然现在说用得比较多的是 MyBaits,但是我工作中也不得不接触 Hibernate,特别是一些老项目需要你维护的时候.所以,在此写下这篇文 ...

  8. Protobuf: 高效数据传输的秘密武器

    当涉及到网络通信和数据存储时,数据序列化一直都是一个重要的话题:特别是现在很多公司都在推行微服务,数据序列化更是重中之重,通常会选择使用 JSON 作为数据交换格式,且 JSON 已经成为业界的主流. ...

  9. 2022-12-18:给定一个长度为n的二维数组graph,代表一张图, graph[i] = {a,b,c,d} 表示i讨厌(a,b,c,d),讨厌关系为双向的, 一共有n个人,编号0~n-1, 讨

    2022-12-18:给定一个长度为n的二维数组graph,代表一张图, graph[i] = {a,b,c,d} 表示i讨厌(a,b,c,d),讨厌关系为双向的, 一共有n个人,编号0~n-1, 讨 ...

  10. 2022-08-26:用一个大小为 m x n 的二维网格 grid 表示一个箱子 你有 n 颗球。箱子的顶部和底部都是开着的。 箱子中的每个单元格都有一个对角线挡板,跨过单元格的两个角, 可以将球导

    2022-08-26:用一个大小为 m x n 的二维网格 grid 表示一个箱子 你有 n 颗球.箱子的顶部和底部都是开着的. 箱子中的每个单元格都有一个对角线挡板,跨过单元格的两个角, 可以将球导 ...