实现视频通话
初始化
首先需要全局初始化 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 可查阅服务端开发文档。
发布音/视频
成功加入房间后,即可在 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();