Windows远程桌⾯实现之⼗三:浏览器客户端使⽤WebRTC传
输,以及WebRTC和MS。。。
by fanxiushu 2022-03-12 转载或引⽤请注明原作者。
接上⽂。
我们先来编译kvswebrtc开源代码。
⾸先得从github下载 ksvwebrtc源码,
分别需要 amazon-kinesis-video-streams-pic, amazon-kinesis-video-streams-producer-c,
amazon-kinesis-video-streams-webrtc-sdk-c 三个,其中amazon-kinesis-video-streams-producer-c其实只需要头⽂件即可,不必编译。
另外还必须要 usrsctp,libsrtp 两个开源库。openssl 开源库也是必须的。这些开源库都可以直接从github下载。
openssl如何编译这⾥就不罗嗦了,⽹上很多介绍。
先来看usrsctp和libsrtp如何编译
(这⾥以windows的编译为例,其他平台下尤其linux下,这些开源库都是⾮常容易编译的)
⾸先在windows中安装最新的cmake程序,
然后打开 cmake-gui程序,直接在cmake界⾯中操作即可,直接编译成 visual studio 的sln⼯程⽂件,
(libsrtp需要 openssl ,因此在 cmake-gui中需要配置 OPENSSL_ROOT_DIR 等变量)
打开sln,直接通过vs编译成lib静态库。编译⽣成 srtp2.lib 和 usrsctp.lib两个静态库。
就这么简单。
同样的,对于kvswebrtc的上⾯提到三个开源代码(其实只需要编译两个)
使⽤cmake⽣成amazon-kinesis-video-streams-pic 的sln⼯程⽂件的时候,需要注意在cmake中设置
BUILD_DEPENDENCIES=OFF,
这样就不会⾃动下载和编译关联项,因为我们只需要 amazon-kinesis-video-streams-pic,
编译成功之后,会⽣成 kvspic.lib, kvspicClient.lib, kvspicState.lib, kvspicUtils.lib 四个lib静态库。
接下来就是稍微⿇烦点的 amazon-kinesis-video-streams-webrtc-sdk-c 编译问题。
⾸先,我们得把 各种头⽂件复制到某个公共⽬录中,⽐如新建⼀个 include ⽬录,
把 usrsctp, libsrtp, amazon-kinesis-video-streams-pic,amazon-kinesis-video-streams-producer-c ,
amazon-kinesis-video-streams-webrtc-sdk-c ⾥边的头⽂件复制到 include⽬录中,
同时,我们必须⼿⼯修改 amazon-kinesis-video-streams-webrtc-sdk-c 的⽂件。
把kvsWebrtcSignalingClient 相关⼯程部分屏蔽掉,因为只需要webrtc标准通信部分,⾄于信令我们⾃⼰实现即可。
cmake如何使用编译 amazon-kinesis-video-streams-webrtc-sdk-c 的时候 cmake除了添加 BUILD_DEPENDENCIES=OFF,
也必须添加 OPENSSL_ROOT_DIR,
⽣成sln⼯程,使⽤VS打开sln之后,把上⾯的include⽬录加⼊到包含⽬录中,
还得修改某些代码,主要是屏蔽 libwebsocket的调⽤和注释掉kvsWebrtcSignalingClient 相关部分。
编译会⽣成 kvsWebrtcClient.lib 库。
所以,最终连接到我们程序中的就是上⾯编译成功的7个lib静态库⽂件,当然还包括openssl⽣成的两个静态库⽂件。
不管怎么说,这些编译和修改⽐起gstreamer的编译和修改(上⼀篇⽂件中描述编译gstreamer过程),简直是太简单了。
也⽐⾕歌⾃⼰的WebRTC编译简单的多,更重要的是kvswebrtc全部使⽤纯C语⾔开发,在各种平台下编译都变得很友好。
接下来,我们再来介绍如何使⽤ kvswebrtc的API接⼝,其实也是⾮常简洁的。
API接⼝的调⽤⽅式接近javascript的webRTC接⼝.
⾸先,在程序开始的地⽅调⽤ initKvsWebRtc 函数,初始化 kvswebrtc。
调⽤ createPeerConnection 函数创建 RtcPeerConnection ,
再然后调⽤ peerConnectionOnIceCandidate 和peerConnectionOnConnectionStateChange 设置 回调函数,
调⽤ addTransceiver 设置媒体通道的传输 Transceiver,
如果是数据通道,调⽤ createDataChannel 创建数据通道,接着调⽤ dataChannelOnOpen打开数据通道,
调⽤ dataChannelOnMessage 设置数据通道接收回调函数。
接着调⽤createOffer 创建OfferSDP,setLocalDescription 函数把OfferSDP设置到本地,调⽤此函数之后,
kvswebrtc开始收集本⽹络和ICE等信息,通过 peerConnectionOnIceCandidate 设置的回调函数返回给调⽤者。
kvswebrtc开始收集本⽹络和ICE等信息,通过 peerConnectionOnIceCandidate 设置的回调函数返回给调⽤者。
然后我们把OfferSDP通过我们⾃⼰的通信协议发给浏览器客户端,同时也把⽣成的 IceCandidate等信息发给浏览器客户端。
当接收到浏览器客户端的AnswerSDP之后,调⽤setRemoteDescription 设置到本地,
接收到浏览器客户端的IceCandidate之后,调⽤addIceCandidate 添加到本地。
当成功建⽴webrtc连接之后(具体通过peerConnectionOnConnectionStateChange 设置的回调函数指⽰是否成功建⽴WebRTC)我们要把已经编码成H264的视频流传输给浏览器客户端,直接调⽤kvswebrtc提供的writeFrame 函数即可。
于是整个kvswebrtc就这样跑通了。
是不是⽐起⾕歌的WebRTC和gstreamer的调⽤⽅式简单得太多,⽽且我测试的使⽤效果也并不差。
真是没有⽐较就没有伤害啊。
具体如何使⽤kvswebrtc,请去查阅kvswebrtc提供的例⼦代码。
上⼀篇⽂章中说过了,在开发WebRTC中,偶然发现 MSE 也可以提供低延迟,实时性的基于video标签的渲染。
于是接下来我们再来研究MSE的实现⽅式。
开始之前,先来张已经在xdisp_virt中实现了webRTC和MSE的截图⽤于提神:
演⽰中,还可以看到xdisp_virt实现了 FrameBuffer截屏,
也就是可以截取到登录纯字符界⾯的linux。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论