windows下封装webrtc用于远程桌面

  第三章我们把信令服务器搭起来了。现在我们把webrtc进行一个高度封装用于远程桌面连接,只向外暴露极简单的接口。要求是尽可能简单,完全不暴露非必要的内容;并且是导出c格式的dll,方便用于c#/java等。

 

  先贴出一个时序图

  

  上面有几个地方我解释一下:

  1.为什么是被控端产生offer。

    因为webrtc使用的SDP协议,offer端需要尽可能暴露更多的“能力”,比如发送视频/发送音频/建立数据通路。这样answer端才能判定自己是否支持,并进行握手。

    如果反过来,由控制端来offer,则SDP里面会什么都没有,这样握手会失败,因为answer端不知道自己该怎么判断音视频能力。

    (因为webrtc的Track有SENDANDRECV和SEDNONLY,但没有RECVONLY;反正我反过来用是不行的)

  2.我使用了免费的中继服务器,因此不需要信令服务器分配中继用户名密码

 

  下面贴出封装的头文件

复制代码
 1 #ifndef WRD_H
 2 #define WRD_H
 3 
 4 // WebRTC for Remote Desktop
 5 // 我们把外部接口尽量简单化
 6 // 外部只需要关注以下几点:
 7 //    0:控制端和被控端生命周期(创建和销毁、各种回调和必要信息)
 8 //    1:sdp收发
 9 //    2:candidate收发
10 //    3:控制端收取被控端桌面画面
11 //    4:自定义数据收发
12 // 1和2是必要的,因为需要信令服务器转发,用于建立隧道
13 // 对于远程桌面,3必须,4是用于传输键鼠动作和共享文件的
14 // 而webrtc本身的各种细节,比如SetLocalSDP以及隧道建立过程中的状态变化等外部根本无需关心
15 //    作为控制端,连接1分钟都没有出画面,用户肯定就关窗口重连了(或者由程序提示失败)
16 //    作为被控端,则直接可以不关心,可以等到控制端动鼠标,用户也就感知了
17 
18 #include <stdbool.h>
19 
20 typedef struct _tagWRDClient* WRDClient;
21 
22 typedef void(__cdecl *WRDSDPGenCallback)(const WRDClient client, const char* sdp, void* usr_param);
23     
24 typedef void(__cdecl *WRDCandidateGatheringCallback)(const WRDClient client, const char* mid, int mline_index, const char* candidate, void* usr_param);
25 
26 typedef void(__cdecl *WRDRemoteImageReceivedCallback)(const WRDClient client, const unsigned char* argb, int w, int h, void* usr_param);
27 
28 typedef void(__cdecl *WRDRemoteRawDataReceivedCallback)(const WRDClient client, bool is_binary, const unsigned char* data, unsigned int data_len, void* usr_param);
29 
30 
31 extern "C" __declspec(dllexport) WRDClient __cdecl wrdCreateViewer();
32 extern "C" __declspec(dllexport) WRDClient __cdecl wrdCreateMaster();
33 
34 extern "C" __declspec(dllexport) void __cdecl wrdGenSDP(WRDClient client, WRDSDPGenCallback gen_done_cb, void* usr_param);
35 
36 extern "C" __declspec(dllexport) void __cdecl wrdOnCandidateGathering(WRDClient client, WRDCandidateGatheringCallback candidate_gathering_cb, void* usr_param);
37 
38 extern "C" __declspec(dllexport) bool __cdecl wrdSetRemoteSDP(WRDClient client, const char* sdp);
39 
40 extern "C" __declspec(dllexport) bool __cdecl wrdAddRemoteCandidate(WRDClient client, const char* mid, int mline_index, const char* candidate);
41 
42 extern "C" __declspec(dllexport) void __cdecl wrdOnRemoteImageReceived(WRDClient client, WRDRemoteImageReceivedCallback image_received_cb, void* usr_param);
43 
44 extern "C" __declspec(dllexport) void __cdecl wrdOnRemoteRawDataReceived(WRDClient client, WRDRemoteRawDataReceivedCallback raw_data_received_cb, void* usr_param);
45 
46 extern "C" __declspec(dllexport) void __cdecl wrdSendRawData(WRDClient client, const unsigned char* data, unsigned int data_len);
47 
48 extern "C" __declspec(dllexport) void __cdecl wrdSendString(WRDClient client, const char* data);
49 
50 extern "C" __declspec(dllexport) void __cdecl wrdClientDestroy(WRDClient *client);
51 #endif//WRD_H
复制代码

  针对这个封装程序的用法,我又画了另外一个时序图,用函数调用的方式来表达。

  

 

  大家可以下载完整代码来观察我的实现。

  如果你同时也会C#,这个测试程序也许你可以试试。

 

  最后修改时间 2022-10-28 11:56:29

posted @   云中双月  阅读(1389)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
历史上的今天:
2012-10-28 为你的文件夹穿上美丽外衣——Win7文件夹背景图片设置
点击右上角即可分享
微信分享提示