“两行”代码,实现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

相关文章

Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码

《Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码》:本文主要介绍Java中日期时间转换的多种方法,包括将Date转换为LocalD... 目录一、Date转LocalDateTime二、Date转LocalDate三、LocalDateTim

SpringBoot实现微信小程序支付功能

《SpringBoot实现微信小程序支付功能》小程序支付功能已成为众多应用的核心需求之一,本文主要介绍了SpringBoot实现微信小程序支付功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作... 目录一、引言二、准备工作(一)微信支付商户平台配置(二)Spring Boot项目搭建(三)配置文件

jupyter代码块没有运行图标的解决方案

《jupyter代码块没有运行图标的解决方案》:本文主要介绍jupyter代码块没有运行图标的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录jupyter代码块没有运行图标的解决1.找到Jupyter notebook的系统配置文件2.这时候一般会搜索到

基于Python实现高效PPT转图片工具

《基于Python实现高效PPT转图片工具》在日常工作中,PPT是我们常用的演示工具,但有时候我们需要将PPT的内容提取为图片格式以便于展示或保存,所以本文将用Python实现PPT转PNG工具,希望... 目录1. 概述2. 功能使用2.1 安装依赖2.2 使用步骤2.3 代码实现2.4 GUI界面3.效

MySQL更新某个字段拼接固定字符串的实现

《MySQL更新某个字段拼接固定字符串的实现》在MySQL中,我们经常需要对数据库中的某个字段进行更新操作,本文就来介绍一下MySQL更新某个字段拼接固定字符串的实现,感兴趣的可以了解一下... 目录1. 查看字段当前值2. 更新字段拼接固定字符串3. 验证更新结果mysql更新某个字段拼接固定字符串 -

java实现延迟/超时/定时问题

《java实现延迟/超时/定时问题》:本文主要介绍java实现延迟/超时/定时问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java实现延迟/超时/定时java 每间隔5秒执行一次,一共执行5次然后结束scheduleAtFixedRate 和 schedu

Java Optional避免空指针异常的实现

《JavaOptional避免空指针异常的实现》空指针异常一直是困扰开发者的常见问题之一,本文主要介绍了JavaOptional避免空指针异常的实现,帮助开发者编写更健壮、可读性更高的代码,减少因... 目录一、Optional 概述二、Optional 的创建三、Optional 的常用方法四、Optio

在Android平台上实现消息推送功能

《在Android平台上实现消息推送功能》随着移动互联网应用的飞速发展,消息推送已成为移动应用中不可或缺的功能,在Android平台上,实现消息推送涉及到服务端的消息发送、客户端的消息接收、通知渠道(... 目录一、项目概述二、相关知识介绍2.1 消息推送的基本原理2.2 Firebase Cloud Me

Spring Boot项目中结合MyBatis实现MySQL的自动主从切换功能

《SpringBoot项目中结合MyBatis实现MySQL的自动主从切换功能》:本文主要介绍SpringBoot项目中结合MyBatis实现MySQL的自动主从切换功能,本文分步骤给大家介绍的... 目录原理解析1. mysql主从复制(Master-Slave Replication)2. 读写分离3.

Redis实现延迟任务的三种方法详解

《Redis实现延迟任务的三种方法详解》延迟任务(DelayedTask)是指在未来的某个时间点,执行相应的任务,本文为大家整理了三种常见的实现方法,感兴趣的小伙伴可以参考一下... 目录1.前言2.Redis如何实现延迟任务3.代码实现3.1. 过期键通知事件实现3.2. 使用ZSet实现延迟任务3.3