在介绍WebRTC通讯之前我们先来看一个P2P视频聊天包括的主要过程,转载请说明出处(博客园RTC.Blacker):
音视频数据采集->编码->发送->接收->解码->播放。
编码、解码、以及会用到加密、解密、回声消除等针对不同系统处理方式都一样,与平台无关,
但像Socket通信涉及到的数据发送、接收不同平台则有不同的处理方式,如Socket模型,windows里面用的是WSASocket,
Linux下用的则是socket,所以他通过模版模式来创建不同类型,
下面主要是介绍WebRTC自带的一个传输模块,实际应用中您可以根据自己的需求注册不同的传输模块。
其中:udp_socket_wrapper.h主要负责Socket相关操作,如Socket创建、启动、端口绑定、停止。
udp_socket2_windows.h主要负责windows平台上的Socket相关操作,与之对应的就是linux平台上的udp_socket_posix.h
udp_transport.h主要负责包的发送和接收,如果你想实现自己的数据包收发逻辑,可重写该类,如他里面的LoopBack方式就是通过重写该模块来实现的。
对客户端调用来说主要就是做四件事情:
1、设置音视频远端地址和端口(包括远端音视频的RTP、RTCP端口和本地接收音视频的RTP、RTCP端口)。
2、启动音视频数据的发送。
3、启动音视频数据的接收。
4、启动音视频数据的播放。
具体代码结构如下:
1 public void start() { 2 this.setRemoteIp(WebRTCClient.str_remote_ip);WebRTCClient.str_to); 3 if (audioEnabled) { 4 startVoE(); 5 } 6 if (receiveVideo || sendVideo) { 7 startViE(); 8 } 9 }
1 public void startVoE() { 2 check(!voeRunning, "VoE already started"); 3 check(voe.startListen(audioChannel) == 0, "Failed StartListen"); 4 check(voe.startPlayout(audioChannel) == 0, "VoE start playout failed"); 5 check(voe.startSend(audioChannel) == 0, "VoE start send failed"); 6 voeRunning = true; 7 }
1 public void startViE() { 2 check(!vieRunning, "ViE already started"); 3 4 if (receiveVideo) { 5 if (viewSelection == context.getResources().getInteger(R.integer.openGl)) { 6 svRemote = ViERenderer.CreateRenderer(context, true); 7 } else if (viewSelection == context.getResources().getInteger(R.integer.surfaceView)) { 8 svRemote = ViERenderer.CreateRenderer(context, false); 9 } else { 10 externalCodec = new MediaCodecVideoDecoder(context); 11 svRemote = externalCodec.getView(); 12 } 13 if (externalCodec != null) { 14 check(vie.registerExternalReceiveCodec(videoChannel, VCM_VP8_PAYLOAD_TYPE, 15 externalCodec, true) == 0, "Failed to register external decoder"); 16 } else { 17 check(vie.addRenderer(videoChannel, svRemote, 0, 0, 0, 1, 1) == 0, 18 "Failed AddRenderer"); 19 check(vie.startRender(videoChannel) == 0, "Failed StartRender"); 20 } 21 check(vie.startReceive(videoChannel) == 0, "Failed StartReceive"); 22 } 23 if (sendVideo) { 24 startCamera(); 25 check(vie.startSend(videoChannel) == 0, "Failed StartSend"); 26 } 27 vieRunning = true; 28 }
希望查看这个调用过程能是您大概明白流媒体数据的发送过程,为后面自定能够以传输模块打下基础。
请思考:WebRTC里面如何操作音视频设备?如打开扬声器,启动摄像头,后面会揭晓答案,请关注。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述