如何快速实现FaceTime多人视频效果

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

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

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

FaceTime 视频窗口自动调节

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

如何快速实现FaceTime多人视频效果_第1张图片

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

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

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

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

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

Google Duo:Knock Knock

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

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

如何快速实现FaceTime多人视频效果_第2张图片

如果基于声网 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尝试实现了其它效果,并写在自己的博客中,欢迎在评论中分享。

你可能感兴趣的:(ios)