Agora 教程 | 如何使用 Qt 开发视频通话应用

栏目: 编程工具 · 发布时间: 4年前

内容简介:作者:单辉,声网 Agora 高级开发工程师。众所周知,Qt 是一个跨平台的 C++ 图形用户界面应用程序开发框架,它具有跨平台、丰富的 API、支持 2D/3D 图形渲染、支持 OpenGL、开源等优秀的特性。很多市面上常见的应用或者游戏,例如说 VLC、WPS Office、极品飞车等,都是基于 Qt 开发。本文将介绍如何使用 Qt 开发一个音视频通话应用。

作者:单辉,声网 Agora 高级开发工程师。

众所周知,Qt 是一个跨平台的 C++ 图形用户界面应用程序开发框架,它具有跨平台、丰富的 API、支持 2D/3D 图形渲染、支持 OpenGL、开源等优秀的特性。很多市面上常见的应用或者游戏,例如说 VLC、WPS Office、极品飞车等,都是基于 Qt 开发。

本文将介绍如何使用 Qt 开发一个音视频通话应用。

一、使用 Qt Quick

Qt 目前有两种创建用户界面的方式:

  • Qt Widgets

  • Qt Quick

其中 Qt Widgets 是传统的桌面界面库,而 Qt Quick 是新一代的高级用户界面技术,可以轻松的用于移动端、嵌入式设备等界面开发。

目前 Qt Widgets 已经基本处于维护阶段,已经非常稳定且成熟。而 Qt Quick 是未来发展的主要方向,其开发更加简捷方便,用户体验更加好。

所以本文选择 Qt Quick 作为创建用户界面的方式,开发环境如下:

  • Qt:5.12.0

  • Qt Creator:4.8.2

  • Agora Video SDK:2.4.0

二、设计交互流程

首先,我们设计一个简单的视频通话 UI 交互流程。

Agora 教程 | 如何使用 Qt 开发视频通话应用

有 2 个主要 UI 界面:

  • JoinRoom:登录频道界面;

  • InRoom:视频通话界面;

以及 3 个辅助 UI 界面:

  • Splash:欢迎界面;

  • VideoSetting:视频参数设置界面;

  • DeviceSetting:设备设置界面;

UI 之间的交互逻辑,已经用对应红色线框标记出来。

三、创建 Qt 项目

打开 Qt Creator,选择创建新的项目。

1. 选择 Qt Quick Application - Empty; 

Agora 教程 | 如何使用 Qt 开发视频通话应用

2. 输入项目名称 AgoraVideoCall,并选择项目路径; 

Agora 教程 | 如何使用 Qt 开发视频通话应用

3. 选择 qmake 编译; 

Agora 教程 | 如何使用 Qt 开发视频通话应用

4. 选择最小支持的 Qt 版本,这里默认为 Qt 5.9; 

Agora 教程 | 如何使用 Qt 开发视频通话应用

5. 选择本地 Qt 版本,这里使用 5.12.0; 

Agora 教程 | 如何使用 Qt 开发视频通话应用

6. 选择版本控制系统;  

Agora 教程 | 如何使用 Qt 开发视频通话应用

四、导入资源

导入 images 资源

我们先将准备好的图标等资源,导入到项目中。

1. 将 images 文件夹拷贝到工程目录中;

2. 在 Qt Creator 的项目视图中,右键点击 Resources/qml.qrc 文件;

3. 选择添加现有路径;

4. 选择 images 文件夹;

5. images 文件夹下的所有资源,会自动添加到 qml.qrc 文件中;

导入 controls 资源

在 Qt Quick 中使用按钮等控件时,有两种方式:

1. 使用 Qt Quick 定义的控件;优点是不用自己开发,可以快速集成使用。

2. 使用用户自定义控件;优点是样式可以自己定义,且可以定义更多官方不提供的控件。

我们这里使用事先准备的一些控件,所以先按照步骤导入到项目中。

1. 将 controls 文件夹拷贝到工程目录中;

2. 在 Qt Creator 的项目视图中,右键点击 Resources/qml.qrc 文件;

3. 选择添加现有路径;

4. 选择 controls 文件夹;

5. controls 文件夹下的所有控件,会自动添加到 qml.qrc 文件中;

需要注意的是,默认情况下控件是没有导入的,需要开发者在要使用的 UI 中导入,例如:

Agora 教程 | 如何使用 Qt 开发视频通话应用

导入 Agora.io 音视频通话 SDK

使用音视频通话功能,需要导入 Agora.io 对应的 SDK,可以注册 Agora.io 的开发者账号,并从 SDK 下载地址 中获取对应平台的 SDK。

下载后将对应的头文件拷贝到项目的 include 文件夹中,静态库拷贝到项目中的 lib 文件夹中,动态库则拷贝到项目中的 dll 文件夹中。

之后则修改 Qt 的工程文件,指定链接的动态库,打开 AgoraVideoCall.pro 文件,并添加以下内容:

INCLUDEPATH += $$PWD/lib	
win32: LIBS += -L$$PWD/lib/ -lagorartcsdk

五、UI 及 UI 业务逻辑

完成项目创建和资源导入后,我们首先需要实现前面设计的 5 个 UI。

创建 UI

1. 在项目上点击右键,并选择 Add New,选择 QtQuick UI File 模板; 

Agora 教程 | 如何使用 Qt 开发视频通话应用

2. 输入 UI 的名称,并完成创建,会直接进入设计窗口; 

Agora 教程 | 如何使用 Qt 开发视频通话应用

3. 根据前面的设计,通过拖拽控件以及调整位置等操作,完成 UI;  

Agora 教程 | 如何使用 Qt 开发视频通话应用

UI 业务逻辑

完成 UI 后,对应的按钮所触发的业务逻辑需要对应添加。在创建 QtQuick UI File 的时候,例如说创建 Splash UI 时,默认会创建两个 qml 文件:

  • SplashForm.ui.qml:UI 的声明描述;

  • Splash.qml:UI 对应事件的响应和部分 UI 业务逻辑;

所以,例如说 Button 的点击事件、鼠标事件等,都通过对应控件的 id 进行关联处理。

例如在 SplashForm.ui.qml 中,我们期待用户如果点击任何地方,则返回到登录界面,则在 SplashForm.ui.qml 中增加鼠标事件监听区域:

在 Splash.qml 中增加业务逻辑:

最后在 main.qml 增加 joinRoom 的响应函数:

这样就完成了一个基本的 UI 业务逻辑。其他例如打开设置窗口、登录到频道中等 UI 业务逻辑类似,就不再一一列举。

当然,实际触发的核心业务逻辑,例如说登录频道进行音视频通话、设置参数生效等可以先留空,在完成所有的 UI 交互响应后,再将该部分逻辑填充进去。

QML 与 C++ 交互

基本 UI 业务逻辑完成后,一般需要 QML 与 C++ 之间的逻辑交互。例如按下进入频道的 Join 按钮后,我们需要在 C++ 中调用 Agora 的音视频相关逻辑,来进入频道进行通话。

在 QML 中使用 C++ 的类和对象,一般有两种方式:

1. 在 C++ 中定义一个 QObject 的子类,注册到 QML 中,在 QML 中创建该类的对象;

2. 在 C++ 中创建对象,并将该对象设置为 QML 的上下文属性,在 QML 中使用该属性;

这里使用第二种方式,定义 MainWindow 类,用来作为核心窗体加载 main.qml,并在其构造函数中将本身设置为 QML 的上下文属性:

六、视频渲染

Agora SDK 提供接口,使得用户可以自己定义渲染方式。接口如下:

VideoRenderImpl 需要继承 agora::media::IExternalVideoRender 类,并实现相关接口:

我们将会使用 OpenGL 来进行渲染,定义 renderFrame

具体描绘部分,在 updateTextures 中实现如下:

这样就可以将 Agora SDK 回调中的 Frame,绘制在具体的 Widget 上了。

七、核心业务逻辑

我们需要简单封装 Agora SDK 的相关逻辑,以提供音视频通话的功能。

回调事件

Agora SDK 会提供很多事件的回调信息,例如远端用户加入频道、远端用户退出频道等,我们需要继承 agora::rtc::IRtcEngineEventHandler 事件回调类,并重写部分需要的函数,来进行事件的响应。

这里我们将事件从 AgoraRtcEngine 的信号函数发出,并在 UI 中进行响应,不做复杂的处理逻辑。

资源管理

定义 AgoraRtcEngine 类,并在构造函数中,初始化音视频通话引擎: agora::rtc::IRtcEngine

注意: 有关如何获取 Agora APP ID,请参阅 Agora 官方文档

在 App 退出时,应当在 AgoraRtcEngine 类的析构函数中,释放音视频通话引擎资源,这里我们通过指定 unique_ptr 的释放函数来自动管理:

登录频道

大部分的逻辑基本上处理好了,接下来就是最重要的一步了。

MainWindow 增加 AgoraRtcEngine 的 QML 上下文属性设置:

用户输入频道名,点击 Join 按钮,触发登录逻辑时,我们在 JoinRoom.qml 中增加事件处理:

在 main.qml 中,调用 AgoraRtcEngine joinChannel 函数,如果成功则切换到 InRoom 界面:

本地流

进入 InRoom 界面后,需要进行本地流(一般是摄像头采集的图像)的渲染。在 InRoom.qml 的 onCompleted 中增加:

AgoraRtcEngine 中,将本地流渲染 Widget 设置为描绘的画布:

远端流

当收到 onUserJoined 和 onUserOffline 的事件时, AgoraRtcEngine 会将该事件抛出:

此时,在 InRoom 界面中,捕获该事件,并进行处理:

我们在 UI 中设计最多只能显示 4 个远端流,所以超过 4 个时,就不再进行 bindView 处理。

AgoraRtcEngine 中,将远端流渲染 Widget 设置为描绘的画布:

至此,基本的核心业务逻辑完成,通话效果如下:

Agora 教程 | 如何使用 Qt 开发视频通话应用

八、总结

Qt 作为一个很成熟的图形界面库,使用起来非常简单,并且具备大量的文档和解决方案,个人认为是桌面下开发图形界面库首选的方案之一。这个 Demo 的开发,希望可以帮到那些,想要为自己的应用增加了音视频通话功能的场景的同学。

Github:https://github.com/AgoraIO/Agora-with-QT

Agora 教程 | 如何使用 Qt 开发视频通话应用


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Getting Started with C++ Audio Programming for Game Development

Getting Started with C++ Audio Programming for Game Development

David Gouveia

Written specifically to help C++ developers add audio to their games from scratch, this book gives a clear introduction to the concepts and practical application of audio programming using the FMOD li......一起来看看 《Getting Started with C++ Audio Programming for Game Development》 这本书的介绍吧!

URL 编码/解码
URL 编码/解码

URL 编码/解码

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具