70

一套代码快速实现一个语音聊天室

 5 years ago
source link: http://www.10tiao.com/html/275/201806/2653646414/1.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.


语音聊天在泛娱乐社交行业中有着重要的地位,行业中很多佼佼者也都为用户提供了语音聊天室,甚至有些平台最初就是依托语音聊天起家的,比如大家熟悉的YY。


从最初的一对一语音通话,到以 YY 为引爆点的多人语音群聊,再到现在聚集了一批“音控”的纯语音社交平台,很多类型的应用中都有语音聊天室。


例如语音电台,这是语音聊天室中比较典型的场景。主播可以在直播间中与给听众讲故事、唱歌,内容形式不一而足,观众也可以申请上麦,与主播聊天互动。主要实现的功能就是语音连麦,以及通过消息系统来实现的文字消息功能。看似简单,但是有些优质的语音社交平台能达到每月1亿的流水。


再譬如语音开黑,它也是语音聊天室的常见应用场景。由于目前还有一些游戏不支持实时语音通话的功能。同时,也有一些王者玩家想收费带青铜小白上分,而游戏中不支持付费带玩,那么语音聊天室成为了满足需求的出口。在一些应用中,玩家可以通过可付费预约的语音聊天室,允许其他玩家预约陪玩的,同时还可以语音开黑。功能上与语音直播相似,只是在这个频道中,不需要增加观众上下麦的逻辑。


如何实现语音聊天室


以上只是包含了语音聊天的部分场景而已,综上来看,语音聊天室需要满足的主要功能包括:


  • 支持多人参与的语音聊天;


  • 支持播放背景音乐;


  • 支持设置背景图片;


要实现一个具备以上功能的语音聊天室,大致可以分为两步:实现语音连麦、支持背景音乐播放。


首先是实现语音连麦。如果要通过自研的方法实现,会相对复杂一些,不仅需要自己部署服务器并做好高并发应对,对编解码器进行优化以解决回声和噪声问题,还要合理部署边缘节点来解决网络延时问题。解决以上几个主要问题后,还需要优化对中小运营商网络的支持。总体来讲,就是需要解决设备端、网络中的语连麦稳定低延时问题与可用性问题。我们在《详解音视频中的低延时》这篇文章中详细分析了优化的思路。


而以上这些问题,我们早已为开发者解决,并将接口集成于声网 SDK 中。开发者无需重复造车轮,再自己搭建媒体服务、信令服务、优化音视频编解码、做网络传输策略优化等问题。


接下来,我们来看一下基于声网视频通话SDK,实现语音聊天室的步骤吧。


首先,要说明下为什么是基于视频通话 SDK 来开发,而不是语音 SDK 呢?


  1. 视频通话 SDK 支持语音与视频功能。若开发者做好语音聊天室后,还可以根据自己需要在该基础上实现视频连麦。


  2. 更便于已经开发视频连麦直播的开发者,进一步实现语音聊天室。


下图为语音聊天室场景化方案的架构图与实现思路:



我们会基于以下开发环境来做开发:


  • Android SDK API Level ≥ 16


  • Android Studio 2.0 或以上版本


  • 支持语音和视频功能的真机


  • App 要求 Android 4.1 或以上设备


SDK 的集成步骤比较简单,对于有开发基础的同学,应该无需手把手教了。


第一步:实现语音连麦


房主一端创建 RtcEngine 对象,并填入 App ID。通过 setChannelProfile 接口将频道设置为直播模式。然后用 setClientRole 来设定主播(Broadcaster)和观众(Audience)的角色。


通常,观众上麦请求、主播通过上麦申请等一系列操作都是通过消息服务来完成的。当观众发出上麦请求,并得到了房主的上麦许可后,只需要通过 setClientRole 将该观众设定为 Broadcaster ,即可上麦。这时,我们就完成了连麦的功能。当观众下麦的时候,同样地,将其身份修改会 Audience 即可。


在主播或观众离开房间时,通过调用 LeaveChannel 来完成。我们可以通过一张图,来了解语音聊天室中接口的调用逻辑:



第二:增加背景音乐


在一些应用场景下,比如秀场、娱乐直播中,通常都会有背景音乐。所以,在实现了基本的连麦功能后,我们还需要增加背景音乐的混音、播放控制。


在这里,主播可以在自己的客户端上选择要播放的音乐,然后通过 SDK 的 AudioMixing 接口在本地与主播语音混音后播放给连麦听众和普通听众。


最后,考虑到在娱乐直播、游戏开黑、社交,甚至是教育场景下的语音聊天室,对于声音的码率、采样率、声道数的需求都有细微差别。我们在 SDK 中,还提供了“设置音质”的接口,即 setAudioProfile,供开发者根据实际听到的效果来自由调整。


public abstract int setAudioProfile(int AUDIO_PROFILE_MUSIC_HIGH_QUALITY_STEREO = 5, int AUDIO_SCENARIO_CHATROOM_ENTERTAINMENT = 1);


举个例子,如果做的是娱乐方向的应用,会遇到听众频繁上下麦的情况,并且需要48 KHz采样率、音乐编码、双声道、编码码率 192 kbps,那么可按照上述代码来设置 profile、scenario(上述代码段可左右拖动,查看完整代码)。


而在教育应用中也有师生之间的语音聊天室。而教育对于语音连麦的要求是,更注重流畅性与稳定性。那么可以将 scenario 的参数设定为AUDIO_SCENARIO_EDUCATION = 2。


我们在 SDK 中对这个接口的 profile 与 scenario 各有5个不同的参数设置,具体大家可查看 setAudioProfile 的详细文档(https://docs.agora.io/cn/2.3/product/Interactive%20Broadcast/API%20Reference/live_video_android#setaudioprofile-live-android)。


有些开发者希望以语音社交切入泛娱乐市场,也有一些市场上的视频社交玩家,希望加入语音聊天室,来进一步拓展市场版图。由于该场景方案是基于声网视频通话 SDK 实现,可以同时满足以上两种需求。


我们在 Github 已经提供了一套完整的 Demo,面向 iOS 与 Android 开发者,大家可以在「语音聊天室」的开发者文档页面(https://docs.agora.io/cn/2.3/product/Interactive%20Broadcast/Solutions/online_chatroom_android?platform=Android#id3)上获取。在 Demo 的基础上,开发者只需要不到1周的时间,对 UI 和功能做简单修改即可准备测试上线。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK