实时音视频

  • 实时音视频 > 快速入门 > iOS >实现视频通话

    实现视频通话

    最近更新时间:2021-11-18 20:55:25

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

    如果您的开发准备还没有完成,请先开始参考开发准备文档进行 SDK 的导入及环境搭建等工作。

    主要流程

    在开发之前,需要先了解下实时音视频通话的主要流程,如下图:

    Android 实时音视频时序图

    其中:

    1. 一路 Track 代表一路音频或者视频的数据。
    2. 加入、离开房间代表一次音视频通话的开始和结束,无需反复调用。
    3. 加入房间后,可通过发布订阅来实现音视频的推送和接收。离开房间后,将无法发布本地音视频,也无法订阅远端音视频。

    初始化

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

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

    添加音视频通话需要的渲染视图

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

    示例代码如下:

    QNGLKView *localPreview = [[QNGLKView alloc] init];
    localPreview.frame = CGRectMake(0, 0, 360, 640);
    [self.view addSubview:localPreview];
    
    QNVideoView *remoteView = [QNVideoView 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 对象,QNRTCClientDelegate 为音视频通话过程中必须的事件监听回调。


    创建音视频 Track

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

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

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

    [cameraVideoTrack play:localPreview];
    

    注意:创建 Track 需要 App 获取设备摄像头、麦克风采集相关的权限,请确保您的应用已经获取该权限,否则数据采集将会失败,可参考 iOS 1v1 Demo 实现。


    加入房间

    完成初始化以及本地音视频 Track 创建后,就可以调用 QNRTCClient.join 加入房间了。

    加入房间需要携带 RoomToken

    1. RoomToken 建议通过您的服务端生成,签算方式可参考 RoomToken 签发服务
    2. 若您的服务端还没有实现相关代码,可参考房间管理文档在 portal 上生成临时的 Token,需要注意 UserID 不可重复。

    示例代码如下:

    [rtcClient join:token];
    

    加入房间成功后会触发 QNRTCClientDelegate.didConnectionStateChanged 回调 QNConnectionStateConnected 状态。此时即可进行发布、订阅等操作。

    在进入音视频通话房间之后,用户可以根据业务场景的需求在适当的时间调用离开房间的接口退出连麦,详情请见房间管理

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


    发布本地音视频 Track

    成功加入房间后,即可在 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 获得发布成功的结果。而远端用户则会通过 QNRTCClientDelegate.didUserPublishTracks 收到发布成功的回调。


    订阅远端音视频 Track

    SDK 默认会进行自动订阅,订阅成功后将会收到 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];
            }
        });
    }
    

    在成功订阅之后,用户可以根据业务场景的需求在适当的时间调用取消订阅的接口取消订阅相应的 Track,详情请见发布与订阅


    离开房间

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

    [self.client leave];
    

    销毁

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

    - (void)dealloc {
        self.client.delegate = nil;
        self.client = nil;
        [QNRTC deinit];
    }
    

    示例代码

    按照上述流程即可实现一个基本的实时音视频通话应用,完整的示例代码可参考 iOS 1v1 Demo

    以上内容是否对您有帮助?
  • Qvm free helper
    Close