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

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

#  实现视频通话

最近更新时间: 2022-03-28 15:58:53

## 初始化

首先需要全局初始化 SDK，请确保仅调用一次

    
    
    using namespace std;
    using namespace qiniu;
    QNRTCSetting setting;
    QNRTC::Init(setting, nullptr);
    

## 创建音视频通话核心类

    
    
    QNRTCClient* client = QNRTC::CreateClient(this);
    

## 创建 Track

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

    
    
    // 创建麦克风 Track
    QNMicrophoneAudioTrackConfig audio_track_config;
    audio_track_config.audio_quality = {sample_rate, channels, bits_per_sample, bitrate};
    QNMicrophoneAudioTrack audio_track = QNRTC::CreateMicrophoneAudioTrack(audio_track_config);
    
    // 创建相机 Track
    QNCameraVideoTrackConfig video_track_config;
    video_track_config.id = camera_device_id;
    video_track_config.capture_config = {width, height, fps};
    video_track_config.encoder_config = {width, height, fps, bitrate};
    QNCameraVideoTrack video_track = QNRTC::CreateCameraVideoTrack(video_track_config);
    

## 枚举视频采集设备

获取本地视频采集设备数量，以及其所支持的采集参数：

    
    
    // 获取本地视频采集设备数量
    int count = QNRTC::GetCameraCount();
    // 遍历本地视频采集设备
    for (int i = 0; i < count; ++i) {
      auto camera_info = QNRTC::GetCameraInfo(i);
    }
    
    

## 加入房间

上文提到过，SDK 所有的功能都是从 `RoomToken` 开始的，所以加入房间只需要将 `RoomToken` 作为参数传给 SDK
就可以了。示例代码如下：

    
    
    client->Join(room_token, user_data);
    

加入房间成功后会触发 `QNClientEventListener.OnConnectionStateChanged` 回调
`QNConnectionState.CONNECTED` 状态。此时即可进行发布、订阅等操作。

> 注：此处 `room_token` 建议开发者的应用程序从自己的 Server 端获取，关于 Server 如何生成 token
> 可查阅[服务端开发文档](https://developer.qiniu.com/rtc/8813/roomToken)。

## 发布音/视频

成功加入房间后，即可在 `QNClientEventListener.OnConnectionStateChanged` 回调中调用以下代码进行本地
Track 的发布：

    
    
    void OnConnectionStateChanged(qiniu::QNConnectionState state, const qiniu::QNConnectionDisconnectedInfo& info)
    {
        if (state == CONNECTED) {
          LocalTrackList local_track_list;
          local_track_list.push_front(audio_track);
          local_track_list.push_front(video_track);
          client->Publish(local_track_list, this);
        }
    }
    

发布成功后，本地会收到 `QNPublishResultCallback.OnPublished` 回调。远端用户会收到
`QNClientEventListener.OnUserPublished` 回调。

## 订阅远端音/视频

SDK 收到远端发布 `QNClientEventListener.OnUserPublished` 的回调，在此回调内则可进行对 Track
的渲染窗口设置的操作，再进行订阅，如果用户默认设置了自动订阅，这里只需设置渲染窗口，不需要主动去订阅：

    
    
    void OnUserPublished(const std::string &remote_user_id,
                           const qiniu::RemoteTrackList &track_list)
    {
      if (client) {
        client->Subscribe(track_list);
      }
    }
    

注：Linux 由于桌面平台多样性, 暂不支持视频渲染，如需要渲染，可以使用
`QNRemoteVideoTrack.SetVideoFrameListener` 获取视频每一帧数据

在成功订阅之后，用户可以根据业务场景的需求在适当的时间调用取消订阅的接口取消订阅相应的 Track：

    
    
    client.UnSubscribe(track_list);
    

## 离开房间

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

    
    
    client->Leave();
    

## 销毁

用户需要调用以下代码对资源进行释放，一般此操作建议在程序生命周期的 `OnDestroy()` 中进行，示例代码如下：

    
    
    if (audio_track_) {
      QNRTC::DestroyLocalTrack(audio_track_);
    }
    if (video_track_) {
      QNRTC::DestroyLocalTrack(video_track_);
    }
    

## 反初始化

当用户不再使用 SDK，需要使用反初始化方法，释放所有资源

    
    
    QNRTC::DeInint();
    

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