1. 首页>
  2. 腾讯云代理

[经验分享] 音视频通讯开发指南

腾讯云 2017年05月06日 浏览655

腾讯云代理 腾讯云直播申请 游戏上云

摘要:

1.概述

    音视频开放SDK(以下简称为SDK)是一个强大的平台无关的实时网络语音对话或视频对话引擎,可用于构建语音视频聊天、视频会议、远程教育等系统。
    SDK提供了构建实时语音视频客户端所需要的所有核心技术,包括音视频设备管理、音视频的采集、编解码、网络传输、显示等功能,支持Windows、iOS和Android平台。
    SDK在各平台上以共享组件的方式提供,采用面向对象化的接口,支持标准C/C++、Objective-C、Java并可以很方便的集成到其他语言中。



2.开发概念和术语

    SDK提供了一组标准接口来简化构建音视频客户端所需要的各种工作。这些接口是高度抽象和自描述的,与之对应的是客户端中的各种概念和术语:


2.1SDK

    在腾讯云音视频通讯服务的相关文档中,如果没有特别说明,SDK特指腾讯云音视频通讯的SDK。


2.2App

    泛指所有使用SDK的应用程序。


2.3设备

    设备用于描述系统中可用来进行音视频会话的各种物理或虚拟的多媒体硬件,设备分为两大类:音频设备和视频设备。每种设备又分为输入设备和输出设备。例如音频设备包括麦克风、扬声器,而摄像头是典型的视频设备。不排除有些设备同时属于音频和视频设备,例如一个虚拟的文件播放器可能会同时输出语音和视频。

    SDK会自动发现和管理系统中存在的可用设备并使之用于音视频会话,同时向用户提供选择使用哪一个设备的权利。例如一个手机用户可以选择前置或者后置摄像头甚至关闭摄像头。系统中也存在一些虚拟的设备以提供额外的功能。例如,通过连接到一个虚拟的远程视频渲染器,可以查看远程视频画面;激活屏幕捕捉器可以远程分享本地屏幕内容。

    SDK内部会根据用户选择来启动/停止相关设备。大多数情况下,用户无需关心设备细节,这些过程是自动完成的。但缺少某种设备可能会影响到相关功能的使用。

    SDK提供了设备管理器来集中管理系统中的设备。在初始化时,设备管理器会枚举系统中可用设备;同时,对系统中热插拔的设备也提供了支持。设备管理器最便利的地方是向应用层提供了查询设备状态和选择工作设备的接口。


2.4音视频房间

    要进行语音视频会话,需要有一个逻辑上的房间。进入房间的成员通过唯一的账号进行区分,彼此之间能够进行音视频会话。房间成员列表会不定期更新,可以查看成员列表并调整各成员的状态。按照成员数量,SDK中能够创建的房间分为双人房间和多人房间两种。在一些点到点的会话中,房间的概念对用户来说可能是透明的,但SDK内部还是需要创建新的房间以容纳本次会话。
通过SDK,可以创建一个新的房间来容纳新的会话,也可以选择加入已有的房间。在会话结束后,可以通过关闭本地房间来退出本次会话。SDK不支持直接管理房间成员的操作,例如,邀请某用户加入本次会话。这类功能可能需要应用层自行实现,SDK只提供容纳会话的基础音视频能力。


2.5房间成员Id

    SDK使用APP帐号系统中的用户帐号作为音视频房间成员间的唯一标识,简称房间成员Id。


2.6控制器

    有时候需要对语音视频通话中的各种参数进行调整,来满足实际需要。例如调节通话音量大小,打开/关闭麦克风增强等。SDK提供了两个控制器来实现这些功能:音频控制器和视频控制器。可以选择使用对应控制器的接口来进行相关操作。



3.开发约定

3.1生命期与内存管理

    SDK内部集中管理所有创建的对象,除了AVContext对象,应用层应避免显式销毁从SDK获取的对象。同时,不建议缓存从SDK中获取的对象引用(例如在C/C++中,这可能是对象指针),这些对象可能会被销毁或改变。正确的做法是,总是从SDK获取要使用对象的引用。
    这一约定使得应用层的编码变得简单,应用开发者无需介入繁琐和不必要的技术细节而专注于应用本身。


3.2异步操作与回调

    在SDK中大部分操作是异步返回的,即调用接口执行操作后,操作结果是由回调返回的。SDK中的回调具有统一的形式并且很容易被定义,这些回调是SDK与应用层之间的通知接口。通常的做法是在这些回调中更新UI界面元素或者触发相关操作。


3.3模式与线程

    为了不阻塞UI交互,SDK的内部采用了多线程架构并遵循MVC模式。这意味着所有对SDK的调用会切换到内部线程进行。确保在UI主线程调用SDK接口是十分必要的。另外,所有的回调也会自动切换到UI主线程。



4.SDK的生命周期管理

4.1SDK的创建和启动

    在使用SDK前,需要创建一个AVContext(SDK上下文)对象。AVContext管理着SDK内部线程以及运行上下文。可以认为,AVContext对象代表着一个SDK运行实例。在大多数情况下,应用程序只需要创建唯一一个AVContext对象即可使用SDK的所有功能。当前也仅支持创建唯一一个AVContext对象,多次创建不会得到预期的结果。App通过调用AVContext::CreateContext()来创建AVContext对象。
    一旦创建了AVContext对象,请在此对象上调用AVContext::StartContext()来启动SDK。StartContext()接收一个回调作为第一个参数,其内部会启动SDK工作线程,并进行一些初始化的工作。这一过程是异步完成的。启动完成后会触发回调。StartContext()的参数“custom_data”会作为回调的第二个参数返回。在SDK正常启动完成后,就可以使用SDK的所有功能了。


4.2SDK的终止和销毁

    在应用退出之前,需要先终止SDK。可以调用AVContext::StopContext()来终止SDK。需要注意的是,StopContext()内部会停止运行的线程,释放各种对象,因此这一过程是异步完成的。
    应用程序需要等待SDK停止完成,再继续调用AVContext::DestoryContext()销毁AVContext对象。需要指出的是,这一过程虽然是异步的,但是很快就可以完成,不用担心会造成UI阻塞。



5.音视频房间相关的开发指南

5.1双人房间和多人房间

SDK设计了双人和多人两种音视频房间:
    - 两种房间目前都是通过服务器中转的方式来进行音视频通信的;
    - 双人房间会针对两人场景通过优化调度策略,选择最佳中转服务器进行接入,连接质量更有优势;
    - 双人房间未来会支持通过直连方式来进行音视频通信,节省中转服务器的带宽成本。


5.2房间委托

    不同于其他异步方法采用回调函数来进行事件通知,房间相关的一些操作结果和事件是通过委托(Delegate)的形式来通知给应用层的,这些委托需要由应用层来实现。

    房间委托基类AVRoom::Delegate具有双人房间和多人房间所共有的一些事件通知接口。应用层需要实现这些接口来完成UI及业务功能。例如,在OnEnterRoomComplete()的实现中,在UI中展示创建的结果并刷新界面元素。房间委托需要处理的事件包括:房间创建、加入、退出房间、房间成员变更、房间状态变更等等。

    创建双人房间时,需要实现一个双人房间委托对象(AVRoomPair::Delegate);创建多人房间时,需要实现一个多人房间委托对象(AVRoomMulti::Delegate)。二者都继承至AVRoom::Delegate类。相对于后者,前者只是在房间成员相关事件上做了一些简化。但是,如果在创建双人房间时提供了一个多人房间委托,则房间创建会失败。


5.3进入房间

    SDK启动完成之后,就可以进入房间以进行语音视频会话了。App调用AVContext::EnterRoom()来进入房间。

    EnterRoom()接收一个房间委托(AVRoom::Delegate)对象作为第一个参数,房间创建的结果以及后续房间的各种事件会通知到该委托对象。EnterRoom()的执行是异步的并且会返回一个错误代码。EnterRoom()内部会首先对传入的参数进行检查,然后才会去执行房间创建操作。

    根据传入的第二个参数的不同,CreateRoom()支持创建两种房间类型:双人房间(AVRoomPair)和多人房间(AVRoomMulti)。与之对应的是两种房间委托对象AVRoomPair::Delegate与AVRoomMulti::Delegate,分别用来通知不同的房间事件。房间创建的结果是通过委托的OnEnterRoomComplete()返回的。

    在一个AVContext生命期内,同时只允许存在一个房间。在创建新的房间之前,需要先退出当前房间。在房间存在期间,应用程序必须保证房间委托是有效的。

    在房间创建成功后,可以通过调用AVContext::GetRoom()获得当前房间对象,应用层应该避免缓存房间对象引用。
    注意,如果没有事先启动AVContext,则房间创建不会成功。


5.4退出房间

    在创建/加入新房间前,需要显式退出当前房间。通过调用AVContext::ExitRoom(),可以退出当前房间。
    注意,在AVContext::ExitRoom()调用之后,通过AVContext::GetRoom()获得的房间对象不再有效。


5.5房间成员

    类AVEndpoint表示位于房间中的一个成员。应用程序无法直接创建房间成员,只能通过查询房间成员的方式获取成员对象引用。一旦得到了一个成员对象的引用,就可以查询其信息状态以及进行各种操作。
    不建议应用程序缓存获得的成员对象引用。这是由于随着成员加入和退出房间,房间内部会创建和销毁成员对象,这会导致缓存的引用失效。任何时候,应该由房间提供的接口来获取成员对象。



6.音频相关的开发指南

6.1设备管理器

    SDK提供了设备管理器类(AVDeviceMgr)来进行音视频设备的集中管理。
    在进入房间之后,App可以调用AVContext::GetAudioDeviceMgr()获得音频设备管理器对象的引用。
    设备在使用过程中可能会出现错误的情况,应用程序如果需要关注这些错误,可以调用AVDeviceMgr::SetDeviceFailCallback(),设置设备错误回调。
    设备管理器还提供了选择当前设备的功能。例如,一个手机用户可能需要从前置摄像头切换到后置摄像头。可以调用AVDeviceMgr::SelectInputDevice()来选择指定的设备。需要注意的是,如果系统只支持当前同时选中单个设备,则上一个选中的设备会被自动取消。


6.2设备

    类AVDevice代表系统中的一个可用设备。应用程序可以通过设备管理器获取系统设备列表并在UI中展示。
    还有一些从AVDevice继承出来的表示某种特定设备的类,比如AVAudioDevice代表着音频设备,它提供了音频设备的相关操作接口,例如可以调节一个扬声器设备的音量。
    SDK提供了类AVAudioCtrl来调节语音视频会话中的音频相关设置。在SDK正常启动之后,可以调用AVContext::GetAudioCtrl()来获得音频控制器对象。
    音频控制器对象提供了一组接口用来调节会话中的音量:GetVolume()、SetVolume()、GetDynamicVolume()。在一些音频设备中也提供了类似的功能接口,应用程序可根据需要自行选择采用哪种方式。
    音频控制器还提供了一组接口用于麦克风操作,例如打开、关闭麦克风增强等。利用GetStat()接口还可以获取系统运行中的音频统计信息。



7.视频相关的开发指南

7.1设备管理器

    SDK提供了设备管理器类(AVDeviceMgr)来进行音视频设备的集中管理。
    在进入房间之后,App可以调用AVContext::GetVideoDeviceMgr()获得视频设备管理器对象的引用。
    设备在使用过程中可能会出现错误的情况,应用程序如果需要关注这些错误,可以调用AVDeviceMgr::SetDeviceFailCallback(),设置设备错误回调。
    设备管理器还提供了选择当前设备的功能。例如,一个手机用户可能需要从前置摄像头切换到后置摄像头。可以调用AVDeviceMgr::SelectInputDevice()来选择指定的设备。需要注意的是,如果系统只支持当前同时选中单个设备,则上一个选中的设备会被自动取消。


7.2设备

    类AVDevice代表系统中的一个可用设备。应用程序可以通过设备管理器获取系统设备列表并在UI中展示。
    还有一些从AVDevice继承出来的表示某种特定设备的类:AVRemoteVideoDevice是远程视频输出虚拟设备;AVCameraDevice则对应本地摄像头设备。
    利用设备类中提供的某类设备特有的接口可以实现特定的功能。例如显示视频设备的画面。
    设备对象由SDK内部创建和管理,因此,不建议在应用程序中缓存设备对象的引用,该引用可能会失效而导致应用崩溃。


7.3视频控制

    SDK提供了类AVVideoCtrl来调节语音视频会话中的视频相关设置。在SDK正常启动之后,可以调用AVContext::GetVideoCtrl()来获取视频控制器对象。
    AVVideoCtrl::SetEncodeSize()可以设置本地视频编码尺寸。AVVideoCtrl也提供了一组获取统计信息和硬件加速的接口。



腾讯云服务商邀请关注:

http://partners.qcloud.com/invitation/99377079157835da208bd0

关注服务商的链接,提供下您关注的QQ,我们这边审核下即可快速回复您的工单问题与技术支持! 感谢您的信任与支持!

auto_1452.png

腾讯云技术交流群


ps:本站信息来源于 bbs.qcloud.com

相关文章

在线客服
淘宝购买
腾讯云直播申请 title=
+成为腾讯云VIP客户 腾讯云直播申请 客服电话

15818558013

0755-33940501-803

0755-33940501-808