很多人会说,要开发webrtc sip功能,直接用网页的webrtc接口不就得了,何必用应用程序。但好多行业软件还是不能全部依赖网页的,例如音视频指挥调度系统,因为要对接监控系统,要实现单页面多监控画面(如4*4),无论性能还是可靠性,QT应用程序更靠谱些。
于是问题就来了,基于QT的音视频调度系统终端,sip功能如何实现呢?使用C/C++等应用编程语言当然可以实现,但考虑到windows、linux以及macos全平台的通用性,还是在QT里面内置支持webrtc的浏览器更简单更方便些。
QT5、QT6已经使用基于chromium内核的QWebEngine支持内置web嵌入,但在实际使用时发现各种问题:1、不能自由定制chromium的版本,2、载入网页会莫名其妙的慢,3、没有开放chromium内核的全部参数,只封装了部分参数提供给接口层,导致webrtc开发体验很差,如,只开放了跟webrtc有关的一个参数:QWebEngineSettings::WebRTCPublicInterfacesOnly,导致QWebEngine中的sip功能被强制打开了mdns功能,导致sip通话建立很慢。
为了解决QWebEngine的问题,可以在QT中引入CEF(Chromium Embedded Framework),根据业务需求,自由使用chromium版本,可以在https://cef-builds.spotifycdn.com/index.html下载合适的CEF版本嵌入到QT程序中。
CEF是一个比较大的开发框架,除了基本的web浏览功能,还提供应用程序和web网页之间的互操作,例如应用程序调用网页js,网页js调用应用程序开放的接口等。对chromium/CEF不熟悉的同学,可以下载GitHub - CefView/QCefView: A Qt Widget encapsulated CEF view based on QWidget这个已经使用QT封装过的CEF Widget,其当前默认使用的chromium版本是113.0.5672.128,也可以在spotifycdn上下载新的chromium/CEF版本替换重新编译。笔者使用的是chromium 121.0.6167.160版本,看图:
在QT中嵌入CEF支持WebRTC功能,最关键的是充分利用CEF开放的chromium参数控制,打开media-stream,usermedia-screen-capturing开关,use-angle启用渲染硬件加速,关闭mdns等,才能充分感受到流畅的webrtc sip视频通话体验。
笔者当初验证QT CEF WebRTC sip功能的界面如下: