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
认真你就输了,一直认真你就赢了!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
2012-10-28 为你的文件夹穿上美丽外衣——Win7文件夹背景图片设置