“两行”代码,实现FaceTime的新多人视频通话效果

2023-10-30 16:50

本文主要是介绍“两行”代码,实现FaceTime的新多人视频通话效果,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一年一度的 WWDC 开幕了。我们看了来自各个勤劳媒体的回顾与解读。在这些新功能中,最吸引我们的还是最新更新的 FaceTime。

这次 FaceTime 不仅开始支持群组视频通话,还可以在视频通话时,判断谁在说,并自动放大他的视频窗口。乍看上去,很是惊艳。不过如果是基于声网视频通话SDK来实现,并不复杂,只需调用几个接口即可实现。

其实,在近些年的各种大型活动上,有不少与视频通话相关的“惊艳”功能,都成为当时的热门话题。我们今天来分享几个往年的“热门话题”,并讲解基于声网SDK如何来实现。

FaceTime 视频窗口自动调节

FaceTime 这次更新后新增多人群组视频通话。在通话过程中,如果你正在说话,那么你的视频窗口就会自动放大。( 点击这里观看视频)

其实这个功能通过声网 SDK 很容易实现,开发者不需要懂得如何玩转AI,只需要使用几个接口即可。我们在 SDK 中首先要实现多人视频通话功能,然后利用接口回调用户uid,了解是哪位用户正在说话,然后调整UI,让该用户窗口变为最大。具体调用的接口如下:

- (int)enableAudioVolumeIndication:(NSInteger)intervalsmooth:(NSInteger)smooth;//启用说话者音量提示
- (void)rtcEngine:(AgoraRtcEngineKit * _Nonnull)engineactiveSpeaker:(NSUInteger)speakerUid;//返回正在说话的用户uid
FaceTime:视频预览

从 FaceTime 诞生起就有一个功能,在发起视频通话后,即便通话未被接听,用户也能在自己手机上看到自己的视频画面。

从实现角度来讲,我们只需要在开始发送音频、视频流之前,将视频数据渲染至界面上就可以达到这个效果。具体的接口调用如下:

setupLocalVideo()//设置预览视图
startPreview()//启动视频预览

Google Duo:Knock Knock

在2016年的 Google I/O 上,Google 发布了一款即时通讯工具 Allo,以及一款视频通话应用 Google Duo。两年过去了,Allo 项目已经被暂停,而主打视频通话的 Duo 却有着令人欣喜的用户增长。

在 Duo 中,有一个“Knock Knock”功能,在视频通话接通之前,被呼叫的一方能看到对方的实时视频画面,而呼叫的一方则看不到。就好像,有人敲了你的门,你凑近门眼,看到门外是朋友还是家人。

如果基于声网 SDK 来实现,我们只需要利用 API 控制好对音频、视频流的发送逻辑即可。在视频通话被接听之前,呼叫方与被呼叫方需要调用的接口如下。

呼叫方:

muteLocalAudioStream(true)//禁止发送音频
muteLocalVideoStream(false)//发送视频
joinChannel()//进入频道

被呼叫方:

muteLocalAudioStream(true)//禁止发送音频
muteLocalVideoStream(true)//禁止发送视频
setupRemoteVideo()//绑定主叫方视图
joinChannel()//进入频道

在通话被接听后,我们需要将此前的部分接口参数进行修改,具体如下。

呼叫方:

muteLocalAudioStream(false)//发送音频
setupRemoteVideo//设置远端视频显示属性

被呼叫方:

muteLocalAudioStream(false)//发送音频
muteLocalVideoStream(false)//发送视频

Snapchat:实时贴纸

在视频通话中,给自己添加各种贴纸和特效,现在已经不算非常新奇了。而最初,Snapchat 在直播中加入该功能时,确实艳惊四座,随即便成为了一种趋势。再回望昨晚的 WWDC,苹果不也给 FaceTime 增加了同类功能么?

首先,开发者可以通过自研的美颜库,或第三方库来对视频进行前处理,然后通过声网 SDK 进行渲染和传输。在这里,开发者可以通过以下两种方式来调用SDK的接口。

方式一:利用自采集 API
   setExternalVideoSource(true, useTexture: true, pushMode: true)pushExternalVideoFrame()
方式二:自定义视频源(视频通话 SDK 2.1及以上版本支持)

步骤 1:实现 AgoraVideoSourceProtocol 的接口,构建自定义的 Video source 类

  • 在获取 Buffer 类型 (bufferType) 的实现中指定视频采集使用的 Buffer 类型

  • 在初始化视频源 (shouldInitialize) 中准备好系统环境,进行初始化参数等设置

  • 在启动视频源 (shouldStart) 中开始采集视频数据

  • 将采集到的数据通过AgoraVideoFrameConsumer Protocol 定义的接口传给 Media Engine

  • 在停止视频源 (shouldStop) 中停止采集视频数据

  • 在释放视频源 (shouldDispose) 中释放硬件等系统资源

步骤 2:创建自定义的视频源对象

步骤 3:通过 Media Engine 的设置视频源 (setVideoSource) 方法把自定义的视频源对象设置给 Media Engine

步骤 4:Media Engine 会在适当的实际调用自定义视频源中实现的AgoraVideoSourceProtocol 的方法

以上,我们仅以 iOS 为例,列出了其中的接口调用逻辑。当然对于其他操作系统,比如 macOS、Android 等系统,我们只需要少做调整也可以实现。详细的接口与参数,请访问开发文档阅读。想自己实现 FaceTime?自己动手尝试一下吧。

如果你基于声网SDK尝试实现了其它效果,并写在自己的博客中,欢迎在本文评论中分享给更多人。

这篇关于“两行”代码,实现FaceTime的新多人视频通话效果的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/309289

相关文章

基于 HTML5 Canvas 实现图片旋转与下载功能(完整代码展示)

《基于HTML5Canvas实现图片旋转与下载功能(完整代码展示)》本文将深入剖析一段基于HTML5Canvas的代码,该代码实现了图片的旋转(90度和180度)以及旋转后图片的下载... 目录一、引言二、html 结构分析三、css 样式分析四、JavaScript 功能实现一、引言在 Web 开发中,

SpringBoot中使用Flux实现流式返回的方法小结

《SpringBoot中使用Flux实现流式返回的方法小结》文章介绍流式返回(StreamingResponse)在SpringBoot中通过Flux实现,优势包括提升用户体验、降低内存消耗、支持长连... 目录背景流式返回的核心概念与优势1. 提升用户体验2. 降低内存消耗3. 支持长连接与实时通信在Sp

Conda虚拟环境的复制和迁移的四种方法实现

《Conda虚拟环境的复制和迁移的四种方法实现》本文主要介绍了Conda虚拟环境的复制和迁移的四种方法实现,包括requirements.txt,environment.yml,conda-pack,... 目录在本机复制Conda虚拟环境相同操作系统之间复制环境方法一:requirements.txt方法

Spring Boot 实现 IP 限流的原理、实践与利弊解析

《SpringBoot实现IP限流的原理、实践与利弊解析》在SpringBoot中实现IP限流是一种简单而有效的方式来保障系统的稳定性和可用性,本文给大家介绍SpringBoot实现IP限... 目录一、引言二、IP 限流原理2.1 令牌桶算法2.2 漏桶算法三、使用场景3.1 防止恶意攻击3.2 控制资源

Python如何去除图片干扰代码示例

《Python如何去除图片干扰代码示例》图片降噪是一个广泛应用于图像处理的技术,可以提高图像质量和相关应用的效果,:本文主要介绍Python如何去除图片干扰的相关资料,文中通过代码介绍的非常详细,... 目录一、噪声去除1. 高斯噪声(像素值正态分布扰动)2. 椒盐噪声(随机黑白像素点)3. 复杂噪声(如伪

springboot下载接口限速功能实现

《springboot下载接口限速功能实现》通过Redis统计并发数动态调整每个用户带宽,核心逻辑为每秒读取并发送限定数据量,防止单用户占用过多资源,确保整体下载均衡且高效,本文给大家介绍spring... 目录 一、整体目标 二、涉及的主要类/方法✅ 三、核心流程图解(简化) 四、关键代码详解1️⃣ 设置

Java Spring ApplicationEvent 代码示例解析

《JavaSpringApplicationEvent代码示例解析》本文解析了Spring事件机制,涵盖核心概念(发布-订阅/观察者模式)、代码实现(事件定义、发布、监听)及高级应用(异步处理、... 目录一、Spring 事件机制核心概念1. 事件驱动架构模型2. 核心组件二、代码示例解析1. 事件定义

Nginx 配置跨域的实现及常见问题解决

《Nginx配置跨域的实现及常见问题解决》本文主要介绍了Nginx配置跨域的实现及常见问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来... 目录1. 跨域1.1 同源策略1.2 跨域资源共享(CORS)2. Nginx 配置跨域的场景2.1

Python中提取文件名扩展名的多种方法实现

《Python中提取文件名扩展名的多种方法实现》在Python编程中,经常会遇到需要从文件名中提取扩展名的场景,Python提供了多种方法来实现这一功能,不同方法适用于不同的场景和需求,包括os.pa... 目录技术背景实现步骤方法一:使用os.path.splitext方法二:使用pathlib模块方法三

CSS实现元素撑满剩余空间的五种方法

《CSS实现元素撑满剩余空间的五种方法》在日常开发中,我们经常需要让某个元素占据容器的剩余空间,本文将介绍5种不同的方法来实现这个需求,并分析各种方法的优缺点,感兴趣的朋友一起看看吧... css实现元素撑满剩余空间的5种方法 在日常开发中,我们经常需要让某个元素占据容器的剩余空间。这是一个常见的布局需求