Quartz 人脸识别 矿工文档 uitableview variables methods installation dynamic triggers cuda UIkit vue router vue双向绑定 abaqus是什么软件 matlab复数求模 string转16进制 kafka学习 内存计算 java集成 java基础数据类型 linux目录 球中的小鬼 苹果滚动截屏 微信python退出程序 无限弹窗bat 隐藏进程 计价软件 识别音乐的软件 go2lan 怎么设置迅雷为默认下载器 u盘系统下载 特战英雄辅助 linux运维之道 微信小程序源代码 js发送http请求 c程序 jpg格式转换器 onaccuracychanged ipad怎么清理内存垃圾 接口自动化测试框架
当前位置: 首页 > 学习教程  > 编程语言

webRTC传输模块

2020/8/11 19:59:03 文章标签:

在介绍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     }

 

希望查看这个调用过程能是您大概明白流媒体数据的发送过程,为后面自定能够以传输模块打下基础。 


本文链接: http://www.dtmao.cc/news_show_100270.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?