human: 如何处理七牛云的实时音视频实现视频通话

gpt: [实时音视频](https://developer.qiniu.com/rtc) > 快速入门 > iOS >实现视频通话

#  实现视频通话

最近更新时间: 2024-07-15 14:41:19

本文将介绍如何快速实现一个基本的实时音视频应用，该应用拥有 SDK 基本的连麦功能，包括 **加入房间** 、**采集** 、**发布** 、**订阅**
等过程。

> 若您的开发环境还没有搭建完成，SDK
> 还未导入，请先参考[开发准备](https://developer.qiniu.com/rtc/quick_start/8831/prepare-
> ios-development)文档进行 SDK 的导入等工作。 若您对实时音视频的**发布** 、**订阅**
> 等基本流程还不熟悉，请先参考[基本概念](https://developer.qiniu.com/rtc/quick_start/9909/the-
> rtc-basic-concept)对实时音视频通话过程中的相关概念略作了解。

# 初始化

首先，在进行 SDK 接口调用之前，需要在 viewController 生命周期中的 viewDidLoad 中进行初始化操作：

    
    
    QNRTCConfiguration *configuration = [QNRTCConfiguration defaultConfiguration];
    [QNRTC initRTC:configuration];
    

# 添加视频渲染视图

用户需要在 self.view 视图布局中期望的位置，添加两个 View 分别用来做本地视频画面预览窗口和远端视频画面渲染窗口。

示例代码如下：

    
    
    QNVideoGLView *localPreview = [[QNVideoGLView alloc] init];
    localPreview.frame = CGRectMake(0, 0, 360, 640);
    [self.view addSubview:localPreview];
    
    QNVideoGLView *remoteView = [[QNVideoGLView alloc] init];
    remoteView.frame = CGRectMake(0, 640, 360, 640);
    [self.view addSubview:remoteView];
    

# 创建音视频通话核心类

本操作推荐在 viewController 生命周期中的 viewDidLoad 中完成

    
    
    QNRTCClient *rtcClient = [QNRTC createRTCClient];
    rtcClient.delegate = self;
    

其中，rtcClient.delegate 是
[QNRTCClientDelegate](https://developer.qiniu.com/rtc/api/9248/QNRTCClientDelegate)
对象，[QNRTCClientDelegate](https://developer.qiniu.com/rtc/api/9248/QNRTCClientDelegate)
为音视频通话过程中必须实现的事件回调代理。

# 创建音视频采集 Track

Track 代表了音视频通话过程中的一路音频或者一路视频，本文仅介绍一路音视频连麦的场景，创建方式如下：

    
    
    QNCameraVideoTrack *cameraVideoTrack = [QNRTC createCameraVideoTrack];
    QNMicrophoneAudioTrack *microphoneAudioTrack = [QNRTC createMicrophoneAudioTrack];
    

创建好本地视频 Track 后即可设置预览窗口，代码如下：

    
    
    [cameraVideoTrack play:localPreview];
    

> **注意** ：创建 Track 需要 App 获取设备摄像头、麦克风采集相关的权限，请确保您的应用已经获取该权限，否则数据采集将会失败，可参考
> [API-Examples-iOS](https://github.com/pili-engineering/QNRTC-
> iOS/blob/master/QNRTC-API-Examples/Api-Examples-iOS/Info.plist) 实现。

# 加入房间

完成初始化以及本地音视频 Track 创建后，就可以调用
[QNRTCClient.join](https://developer.qiniu.com/rtc/api/8836/QNRTCClient-
iOS#join%5B1/2%5D) 加入房间了。

> 加入房间需要携带 [RoomToken](https://developer.qiniu.com/rtc/quick_start/9909/the-
> rtc-basic-concept#room_token)
>
>   1. [RoomToken](https://developer.qiniu.com/rtc/quick_start/9909/the-rtc-
> basic-concept#room_token) 建议通过您的服务端生成，签算方式可参考 [RoomToken
> 签发服务](https://developer.qiniu.com/rtc/8813/roomToken)
>   2.
> 若您的服务端还没有实现相关代码，可参考[管理实时音视频](https://developer.qiniu.com/rtc/9858/applist#4)文档在
> [portal](https://portal.qiniu.com/app) 上生成临时的 Token，需要注意 **UserID不可重复** 。
>

示例代码如下：

    
    
    [rtcClient join:token];
    

加入房间成功后会触发
[QNRTCClientDelegate.didConnectionStateChanged](https://developer.qiniu.com/rtc/api/9248/QNRTCClientDelegate#didConnectionStateChanged)
回调 [QNConnectionStateConnected](https://developer.qiniu.com/rtc/9255/quick-
start-iOS/9254) 状态。此时，可通过发布、订阅等操作来实现音视频的推送和接收。

在进入音视频通话房间之后，用户可以根据业务场景的需求，在适当的时间调用离开房间的接口退出连麦，详情请见[房间管理](https://developer.qiniu.com/rtc/development_guidelines/9261/room-
management-iOS)。

> **注意** ：加入、离开房间代表一次音视频通话的开始和结束，一次会话仅需调用一次加入、离开的操作即可，无需重复调用。

# 发布本地音视频 Track

成功加入房间后，即可在
[QNRTCClientDelegate.didConnectionStateChanged](https://developer.qiniu.com/rtc/api/9248/QNRTCClientDelegate#didConnectionStateChanged)
回调中调用以下代码进行本地 Track 的发布：

    
    
    - (void)RTCClient:(QNRTCClient *)client didConnectionStateChanged:(QNConnectionState)state disconnectedInfo:(QNConnectionDisconnectedInfo *)info {
        dispatch_async(dispatch_get_main_queue(), ^{        
            if (QNConnectionStateConnected == state) {
                [self.client publish:@[cameraVideoTrack, microphoneAudioTrack] completeCallback:^(BOOL onPublished, NSError *error) {
                        if (onPublished) {
                        	// 发布成功了
                        } else {
                        	// 发布失败了
                        }
                 }];
            } 
        });
    }
    

发布成功后，本地通过
[QNPublishResultCallback.onPublished](https://developer.qiniu.com/rtc/api/9254/QNTypeDefines#QNPublishResultCallback)
获得发布成功的结果。而远端用户则会收到
[QNRTCClientDelegate.didUserPublishTracks](https://developer.qiniu.com/rtc/api/9248/QNRTCClientDelegate#didUserPublishTracks)
发布成功的回调。

在成功发布之后，用户可以根据业务场景的需求，在适当的时间调用取消发布的接口
[QNRTCClient.unpublish](https://developer.qiniu.com/rtc/api/8836/QNRTCClient-
iOS#unpublish)，取消发布相应的
Track，详情请见[发布与订阅](https://developer.qiniu.com/rtc/development_guidelines/8769/publish-
and-subscribe-iOS)。

# 订阅远端音视频 Track

当远端成功发布音视频数据后，SDK 默认会进行自动订阅，订阅成功后将会收到
[QNRTCClientDelegate.didSubscribedRemoteVideoTracks](https://developer.qiniu.com/rtc/api/9248/QNRTCClientDelegate#didSubscribedRemoteVideoTracks)
的回调，此时在回调内部渲染显示远端窗口：

    
    
    - (void)RTCClient:(QNRTCClient *)client didSubscribedRemoteVideoTracks:(NSArray<QNRemoteVideoTrack *> *)videoTracks audioTracks:(NSArray<QNRemoteAudioTrack *> *)audioTracks ofUserID:(NSString *)userID {
        dispatch_async(dispatch_get_main_queue(), ^{
            for (QNRemoteVideoTrack * videoTrack in videoTracks) {
                [videoTrack play:remoteView];
            }
        });
    }
    

在成功订阅之后，用户可以根据业务场景的需求，在适当的时间调用取消订阅的接口
[QNRTCClient.unsubscribe](https://developer.qiniu.com/rtc/api/8836/QNRTCClient-
iOS#unsubscribe)，取消订阅相应的
Track，详情请见[发布与订阅](https://developer.qiniu.com/rtc/development_guidelines/8769/publish-
and-subscribe-iOS)。

# 离开房间

当音视频通话结束，调用以下代码离开房间：

    
    
    [self.client leave];
    

> **注意** ：离开房间代表本地音视频通话的结束，将无法发布本地音视频，也无法订阅远端音视频。

# 销毁

在整个 viewController 销毁时，用户需要调用以下代码对资源进行释放，一般此操作建议在 viewController 生命周期的
`dealloc` 之前进行，示例代码如下：

    
    
    - (void)viewDidDisappear:(BOOL)animated {
        [QNRTC deinit];
        [super viewDidDisappear:animated];
    }
    

# 示例代码

按照上述流程即可实现一个基本的实时音视频通话应用，完整的示例代码可参考 [API-Examples-
iOS](https://github.com/pili-engineering/QNRTC-iOS/blob/master/QNRTC-API-
Examples/Api-Examples-iOS/Module/Video/CameraVideo/CameraVideoExample.m)。

以上内容是否对您有帮助？