一:PeerConnection参数详解

在前面我们使用RTCPeerConnection的时候,把参数设置成了null(或者不填),因为这个参数configuration本身是可以不填的。

(一)RTCPeerConnection格式

WebRTC学习(八)1V1音视频实时互动直播系统_WebRTC

(二)参数了解

在RTCconfiguration这个结构体里有好几项:

WebRTC学习(八)1V1音视频实时互动直播系统_WebRTC_02

最关键的一项是iceServers,也就是说我们在建立这个RTCPeerConnection之前可以给他传入很多的iceServers(也就是我们的STUN和TURN服务)。

通过这个STUN和TURN服务可以做检测,获取到相应的反射地址和中继地址,之后他就可以进行这些连接性检测的时候找出它的优先级,那么优先级我们上节就说了,在测试STUN和TURN服务的时候那个工具里就有这个优先级的显示;

第二项是iceTransportPolicy,也就是传输的策略,它的传输策略有两种,一种是all(支持STUN/TURN)一种是relay(只支持TURN服务)。

如果是all的话就支持host本机的地址,也就是穿越NAT反射后的candidate以及中继的candidate,如果是relay类型只收集中继类型的candidate也就是中继的通路,这是第二项。

第三项是bundlePolicy,bundlePolicy这个策略实际也有好几种,默认是balanced,也就是平衡的,后面会详细的介绍。

第四项是rtcpMuxPolicy的复用,复用策略,默认是require。

第五项peerIdentity就是一个标识的字符串。

第六项certificates就是一些证书,也就是我们每一个连接,每一个可连通的候选者都需要有一个证书。

所以如果你有多个连接,你就有多个证书,但是一般情况下如果是复用的话,我就用一个证书就可以了,这样可以增加它建成整个传输的速度。

第七项就是iceCandidatePoolSize,也就是我要收集的候选者的空间有多大,默认是0;如果你设置成5的话,如果你有20个,那只选其中的5个。

(三)参数详解---bundlePolicy策略

WebRTC学习(八)1V1音视频实时互动直播系统_bundle_03

Balanced实际就是音频轨、视频轨各自各自使用一个传输通道,是分开的。其中多路音频轨是共用同一个传输通道、多路视频轨也是使用同一个通道。

max-compat是最大兼容性,怎样才能达到最大的兼容性呢?就是每一个轨都有自己的通道,如果我有这个两个音频,一个视频,就有三个通道,就是每个音频走自己的,那视频也是一样的。等到Balanced策略不成功的时候,就使用max-compat这种方式。

max-bundle就是最大化的使用一个绑定,那就是将所有的这些这个媒体的这个流都用一个这个通道进行传输。这是webrtc建议的方式,这样的话对于底层来说就比较简单了,而且你建立这个连接之后,只需要一个证书,而不需要一堆证书,否则的话,你每一个连接都需要一个证书,就会非常的耗费时间。

(四)参数详解---certificates证书

WebRTC学习(八)1V1音视频实时互动直播系统_信令_04

再下来就是certificates证书,是授权的,可以使用的,进行连接的一组证书。我们可以为每个连接提供这一组证书,也可以不提供,不提供的话就会自动产生,所以这个证书的话一般我们也不会设置。

(五)参数详解---iceCandidatePoolSize候选者池大小

WebRTC学习(八)1V1音视频实时互动直播系统_ide_05

那接下来的是iceCandidatePoolSize池大小,是一个16位的整数,用于指定预取的这个ICE候选者的个数。

那么我们如果一旦设置了一个池,并且拥有比池大小多的候选者,那么我们就不能放在这里了,多出来就不放入池中。

还有一个重要的一个功能,如果这个iceCandidatePoolSize它的值发生变化了,那么会重新收集候选者,比如最开始我设成了3,然后我紧接着设成了10,这个时候会在底层会重新触发收集候选者,如果某条链路由于网络原因发生拥塞无法通信,那么我们可以改变这个值,让它触发收集候选者,重新收集这个Candidate,然后选择其他路。

(六)参数详解---iceTransportPolicy传输策略

WebRTC学习(八)1V1音视频实时互动直播系统_信令_06 

传输策略有两种,一种是那个relay就是中继,就是收集这个候选者的时候,只收集这个中继的候选者。因为在真实的网络情况下,中继的这个候选者可能会经常使用,而NAT穿越在国内实现比较困难,所以一般都是使用relay。

然后还有all,就是说我的这个hosts的类型,NAT穿越反射的类型,以及这个relay类型的都要收集,这是它的不同的策略,我们一般用all。

(七)参数详解---iceServers

WebRTC学习(八)1V1音视频实时互动直播系统_WebRTC_07

包括了credential凭证,实际是有一个双层的含义,会根据下面这个credentialType类型,然后去处理他,如果credentialType是password的,那么credential属性就是password,如果credentialType是oauth的,credential这个值就是一个结构体,这个结构体也就包括了一个Key,还有一堆证书。是根据credentialType类型然后来看他的credential的值。

urls:比如说我们设置的这个STUN和这个TURN服务,如果有的话,每一个都是一个url串,通过这个url串我们可以访问到这个地址,从而访问STUN和TURN服务。

username:跟credential匹配,一个用户名一个密码 

(八)参数详解---rtcpMuxPolicy复用策略

WebRTC学习(八)1V1音视频实时互动直播系统_服务端_08 

第一个是negotiate协商,就是收集RTCP和RTP复用的ICE候选者,如果不能复用,那么就单独出来各自走各自的通道,RTP走RTP的,RTCP走RTCP的就好了。

第二个是require,就是我就一定要收RTP和RTCP复用的ICE,这些候选者才真正使用,那么如果不能复用,那就失败。

(九)参数详解---addIceCandidate

WebRTC学习(八)1V1音视频实时互动直播系统_信令_09

那么candidate这个类型包括哪些属性呢?

candidate,候选者描述信息;

sdpMid代表着每一路流,这个ID之前在讲SDP的时候给大家介绍过,比如说我们那个视频是video就是0。

sdpMLineIndex,是m=的索引值,它是第几个M?比如说我们在这个SDP中一共有两个,一个视频,一个音频,那么的视频是第一个,音频是第二个,那么引入音频的话,就是2,视频的就是1。

usernameFragment,就是提到的ICE uflag字段。

本机的信令服务器,再加上这个STUN和TURN服务,这样我们就能做出一个真正的一对一的音视频实时互动直播系统!!!

二:直播系统中的信令及其逻辑关系

(一)客户端发送的信令

WebRTC学习(八)1V1音视频实时互动直播系统_信令_10

join加入房间 

客户端发送信令比较少,第一个就是加入房间。当一个用户跟服务器连接之后,会发送一个join,那么服务器端在收到join这个信息之后就将这个用户加入到这个服务器端。

leave离开房间

第二个就是离开房间,这样能够随时知道房间内的人数实际有多少。我只进不出这样的话它就一直累加,那可能服务器端有一万人,实际真正的只有两个人,这也是我们很多直播系统里弄假数据的一个方法,它只进不出,但我们这里要有进有出。

message端到端消息

第三个就是message,message就是将消息之间发送给对端,怎么发送呢?也就是说它首先发送到服务端,服务端收到之后再将它中转给任意一个客户端 ,所以在服务器端是没有任何的逻辑操作的,只是做一个转发而已

以上就是三个主要的命令,也就是加入房间、离开房间、和发送端对端的消息,但是端对端的消息我们又可以细分三个。

(二)补充端到端消息类型

WebRTC学习(八)1V1音视频实时互动直播系统_WebRTC_11

Offer消息

第一个就是通过我们createOffer获取到了我本机的媒体描述信息,就是我的媒体能力,这个我们此前已经介绍了就是createOffer,
当调用这个函数获取到我本机的媒体信息之后,通过这个SDP,它是一个SDP的格式描述的,它就直接将它发送到服务端,服务端收到这个Offer之后转给另外一个终端,就可以将整个的协商过程进行串起来了。

Answer消息

同样的道理,当对方收到这个Offer之后它调用setRemoteDescription之后它要调createAnswer然后之后才能调用setLocalDescription,那在创建完Answer之后它也要创建Answer消息,也就是说将它本地的媒体协商信息传到呼叫端,这是Offer和Answer这就形成了一个交互。

Candidate消息

除此之外还有Candidate,也就是说如果我们双方要通信的话要知道彼此的candidate,对方拿到这个candidate之后就要进行这个连通性检测,找到一个非常高效的链路之后它们后边音视频数据传输打好基础。

(三)服务端信令

WebRTC学习(八)1V1音视频实时互动直播系统_ide_12

joined已加入房间

第一个是joined,这个很简单,当一个用户发送join加入房间之后,服务端说你这个已经加入成功了,要给他回一个消息确认:joined,那客户端收到这个joined之后就知道我与服务端这个信令已经发送成功了,那它可以用joined的这个消息去做后面的逻辑处理。

otherjoin其他用户加入房间

当有一端发送join到服务端之后呢,服务端一方面要给发送者回一个joined消息告诉它你已经加入了,另外它要给另外一个端另外一个参与者发送一个otherjoin,就是告诉另外一个参与者说有有另外一个人加进来了,就是这个消息,那另外一个人知道有人加进来了那就知道现在有两个人现在在这个房间中了。这个时候我们就可以进行媒体协商然后进行音视频的通讯了。这就是otherjoin。

full房间人数已满

第三个是full,也就是当有第三个用户再加入房间的时候,就不让他通讯了,就告诉他这个房间人数已满,你不能再来了,我们只支持一对一的音视频传输;

leaved已离开房间

用户离开的时候它发送leave,服务端就给他回一个leaved说确认你已经离开了,那一个比较好的处理方式是说当用户收到这个leaved之后再离开。
这个有利有弊,可以辩证的看,就是说我们在处理这种消息比较多的之后是两个方面都要做的,就是说当用户离开的时候,为了客户端能快速的离开,那它可能就直接发送完了就断开了;
但是带来一些麻烦就是说你虽然走了但是你这个leave有可能没有发送到服务端,这个时候服务端就要等这个超时时间,所以它在统计人数或者是说在做一些逻辑处理的时候可能就比较麻烦。
所以我们一般的做法是客户端发送leave消息要等一个超时时间,如果服务端在这个超时时间内回这个消息了,那我就用回这个消息去释放相应的资源,这样整个流程就是通的了。
如果这个超时时间内没有回来,就是该离开还得离开,因为这个时候我还得离开,因为我不能等你,不能让用户感觉我卡死了。这就是leaved。

bye对方离开房间

另外一个就是也要告诉对方,也就是说发送一个bye告诉对方这个人离开了,在对方的用户列表里就要将这个人删除掉,或者说知道对方离开了,对我们一对一的来说,那它也要释放一些资源再等待,当有另外一个用户来的时候再重新创建资源进行音视频的通讯。

(四)直播系统的消息处理流程(与信令服务器的交互)

WebRTC学习(八)1V1音视频实时互动直播系统_ide_13

成员组成:

左边有个Caller,它是呼叫者,第二个是SigServ就是信令服务器,第三个是Callee就是被呼叫者,第四个Callee是另外一个被呼叫者

通信流程:

1.首先呼叫者它要创建与信令服务器建立连接,对于其他端来说也是先把连接建立好,否则信令就是不通的;

2.这时候呼叫者首先发送一个信令是join,说我要加入房间,那么信令服务器回一个joined,表示你这个加入消息已经知道了,已经将你加入到房间了;

3.另外一个用户这时候也发送一个join加入房间,这时服务器也回一个joined,就是一个请求一个应答,这样它也被加入房间,当第二个用户也加入房间之后,服务端要给第一个用户回一个otherjoin,这时候第一个用户就知道有另外一个用户已经进来了,这时候他们可以进行协商了,然后进行通讯了。那么怎么进行媒体协商呢?就是发送端对端的消息,也就是message,它这个message里包括三个包括我们刚才讲的,也就是一个Offer,也就是它刚才发送的一个Offer给对方,对方处理完了然后回一个Answer在回来,这时候当有收集到这个Candidate地址的时候就收集好了,收集完了之后就通过这个信令服务器转发给对方,对方拿到这个Candidate之后就进行 连通性检测,检测成功了之后这时候就可以进行P2P或者TURN服务进行音视频数据的转发,那它们就真正的通讯了。

4.如果这时候有第三个用户Callee发送join说我要加入房间,那信令服务器一查看它这个列表现在已经有两个用户了,所以就给它返回一个full,说你不能加入这个房间。这时候第三个用户就要释放资源,比如这个提示信息比如“房间已经满了,不能再添加了”;所以这个时候与第三个用户已经没有任何关系了,就只有Caller和Callee这两个用户。

5.那再下面,当有一个用户说我要离开了,比如说这里的Callee,它发送一个leave给信令服务器,信令服务器收到这个leave之后,首先也要告诉对端,就是说对方和你说byebye了,那你要做相应的处理,紧接着信令服务器再给这个发送者回一个leaved,也就是说你这个消息我已经成功转发了。

6.同样的道理如果是主叫方去发送这个leave,那这个信令服务器也是走同样的流程,先给另一方发送bye,然后回一下这个leaved,然后整个信令服务流程就是这样一个关系。

(五)代码实现处理流程

'use strict'
var https = require("https");
var fs = require("fs");

var express = require("express");
var serveIndex = require("serve-index");

var socketIo = require("socket.io");    //引入socket.io

var USERCOUNT = 3;                        //

var log4js = require('log4js');            //开启日志
var logger = log4js.getLogger();
logger.level = 'info';

var app = express();                    //实例化express
app.use(serveIndex("./"));        //设置首路径,url会直接去访问该目录下的文件
app.use(express.static("./"));    //可以访问目录下的所有文件

//https server
var options = {
    key : fs.readFileSync("./ca/learn.webrtc.com-key.pem"),            //同步读取文件key
    cert: fs.readFileSync("./ca/learn.webrtc.com.pem"),                //同步读取文件证书
};

var https_server = https.createServer(options,app);
//绑定socket.io与https服务端
var io = socketIo.listen(https_server);    //io是一个节点(站点),内部有多个房间
https_server.listen(443,"0.0.0.0");
//---------实现了两个服务,socket.io与https server;都是绑定在443,复用端口

//-----处理事件
io.sockets.on("connection",(socket)=>{    //处理客户端到达的socket
    //监听客户端加入、离开房间消息
    socket.on("join",(room)=>{
        socket.join(room);                //客户端加入房间
        //io.sockets指io下面的所有客户端
        //如果是第一个客户端加入房间(原本房间不存在),则会创建一个新的房间
        var myRoom = io.sockets.adapter.rooms[room];    //从socket.io中获取房间
        var users = Object.keys(myRoom.sockets).length;    //获取所有用户数量

        logger.info("the number of user in room is:"+users);

        //开始回复消息,包含两个数据房间和socket.id信息
        if(users < USERCOUNT){
            socket.emit("joined",room,socket.id);    //给本人
            //如果房间有其他人,发送otherjoin消息给他们
            if(users > 1){
                socket.to(room).emit("otherjoin",room,socket.id);
            }
        }else{    //告知人满,别来
            socket.leave(room);
            socket.emit("full",room,socket.id);
        }
    });
    
    socket.on("leave",(room)=>{
        var myRoom = io.sockets.adapter.rooms[room];    //从socket.io中获取房间
        var users = (myRoom)?Object.keys(myRoom.sockets).length:0;    //获取所有用户数量
        socket.leave(room);  //离开房间
        logger.info("the number of user in room is:"+(users-1));

        socket.emit("leaved",room,socket.id);    //给自己发送leaved
        socket.to(room).emit("bye",room,socket.id);    //给其他人发送bye
    });

    socket.on("message",(room,msg)=>{
        socket.to(room).emit("message",room,msg);
    });
});
三:CreateOffer参数详解

(一)在:WebRTC学习(六)端对端传输中使用过createoffer方法:

WebRTC学习(八)1V1音视频实时互动直播系统_服务端_14

(二)CreateOffer基本格式和参数

WebRTC学习(八)1V1音视频实时互动直播系统_信令_15

options共有4个,前面提到2种(offerToRecieveAudio和offerToRecieveVideo),这里介绍另外两种(iceRestart和voiceActivityDetection)

(三)CreateOffer中options参数---iceRestart(重新启用ICE)

重启启动ICE之后就会重新启动Candidate收集,在收集candidate完成之后进行连通性检测。

那它有什么好处呢?

  • 场景一:就是当我们使用手机的时候从4G换成wifi,或者从wifi换成4G的时候,实际它的链路已经发生了变化,就是说我们的IP地址和出口都发生了变化,这时我们应该重新进行链路选择;
  • 场景二:就是说我们的传输网络是动态变化的(与数据流量的多少,是否有人抢占带宽等等都是有关的),当我们最开始选择的线路,是比较高效的,连通性比较好。但是过了一端时间后,由于某种原因产生拥塞,这时如果有其他更好的通路的话,我们有必要重新选择一条路。
  • 场景三:就是比如说我们在服务器端增加了新的中继节点 (TURN服务),比如我们又增加了三个TURN服务,需要将这些TURN服务增加到连接的配置服务中去,那这个时候也应该重新启动ICE让它重新选路。

基于以上的这些原因,这个iceRestart是非常好的一个方案,当我们设置它为true的时候,当有以上场景的变化的时候就可以触发重新选路,自动的去帮我们去选择新的有效的数据传输的线路,这是一个非常好的机制。

(四)CreateOffer中options参数---voiceActivityDetection(静音检测)

静音检测有什么的好处?

在本机端,当我们不说话的时候,有一些背景噪音实际是可以被忽略掉,当检测到这个没有人声只是一些背景噪音的时候,我们可以选择不传输这些背景噪音。

在另外一端呢,当我们打开了静音检测之后,如果没有音频数据过来的时候,会自己去创建静默包(在本机,不进行网络传输),在没有声音的时候第一个可以减少带宽;另外,可以把一些没必要的背景音省去。

(五)协商过程代码测试ICE restart

1.效果如何查看?ICE restart的最终的结果反映在哪?

结果反映在SDP,反映到我们的媒体协商上:在媒体协商的时候,当进行交换SDP的时候,通讯的双方获取ICE uflag属性。

之前学习SDP规范中了解ICE ufrog 和 ICE password,那这两个参数是干什么呢?

就是用于验证candidate对(通路)的连通性,当链路发生变化的时候,就要重新进行这个检测。

注意:在检测过程中,如果发现一条新的通路(更高效),这时就会把数据切换到新的通路,但是在新的通路没有建成之前,老的通路还是依然在正常传输数据。

我们怎么能知道这个ICE restar的有没有真正的起效果,我们的观察点就在于协商后的SDP,看他的ICE-uflag和ICE password有没有发生变化。

如果没有变化的话,说明ICE没有启动,如果发生变化了,说明ICE启动了。

本次代码通过主动去调用createOffer方法,实现重新检测,使得ICE ufrog属性修改(当然,前提是设置为true)

2.代码实现

server.js不变,使用sudo node server.js启动:

WebRTC学习(八)1V1音视频实时互动直播系统_WebRTC_16WebRTC学习(八)1V1音视频实时互动直播系统_服务端_17
'use strict'

var http = require("http");
var https = require("https");
var fs = require("fs");

var express = require("express");
var serveIndex = require("serve-index");

var socketIo = require("socket.io");    //引入socket.io

var USERCOUNT = 3;                        //

var log4js = require('log4js');            //开启日志
var logger = log4js.getLogger();
logger.level = 'info';

var app = express();                    //实例化express
app.use(serveIndex("./"));        //设置首路径,url会直接去访问该目录下的文件
app.use(express.static("./"));    //可以访问目录下的所有文件

//https server
var options = {
    key : fs.readFileSync("./ca/learn.webrtc.com-key.pem"),            //同步读取文件key
    cert: fs.readFileSync("./ca/learn.webrtc.com.pem"),                //同步读取文件证书
};

var https_server = https.createServer(options,app);
//绑定socket.io与https服务端
var io = socketIo.listen(https_server);    //io是一个节点(站点),内部有多个房间
https_server.listen(443,"0.0.0.0");
//---------实现了两个服务,socket.io与https server;都是绑定在443,复用端口

//-----处理事件
io.sockets.on("connection",(socket)=>{    //处理客户端到达的socket
    //监听客户端加入、离开房间消息
    socket.on("join",(room)=>{
        socket.join(room);                //客户端加入房间
        //io.sockets指io下面的所有客户端
        //如果是第一个客户端加入房间(原本房间不存在),则会创建一个新的房间
        var myRoom = io.sockets.adapter.rooms[room];    //从socket.io中获取房间
        var users = Object.keys(myRoom.sockets).length;    //获取所有用户数量

        logger.info("the number of user in room is:"+users);

        //开始回复消息,包含两个数据房间和socket.id信息
        if(users < USERCOUNT){
            socket.emit("joined",room,socket.id);    //给本人
            //如果房间有其他人,发送otherjoin消息给他们
            if(users > 1){
                socket.to(room).emit("otherjoin",room);
            }
        }else{    //告知人满,别来
            socket.leave(room);
            socket.emit("full",room,socket.id);
        }
    });
    
    socket.on("leave",(room)=>{
        var myRoom = io.sockets.adapter.rooms[room];    //从socket.io中获取房间
        var users = (myRoom)?Object.keys(myRoom.sockets).length:0;    //获取所有用户数量

        logger.info("the number of user in room is:"+(users-1));

        socket.emit("leaved",room,socket.id);    //给自己发送leaved
        socket.to(room).emit("bye",room,socket.id);    //给其他人发送bye
    });

    socket.on("message",(room,msg)=>{
        socket.to(room).emit("message",room,msg);
    });
});
server.js

index.html添加button控件:

WebRTC学习(八)1V1音视频实时互动直播系统_WebRTC_16WebRTC学习(八)1V1音视频实时互动直播系统_服务端_17
<html>
    <head>
        <title>    CreateOffer ICE start </title>
    </head>
    <body>
        <h1>CreateOffer ICE start</h1>
        <div>
            <video autoplay playsinline id="localvideo"></video>
            <video autoplay playsinline id="remotevideo"></video>
        </div>

        <div>
            <button id="createOffer">createOffer</button>
        </div>
    </body>
    <script type="text/javascript" src="https://webrtc.github.io/adapter/adapter-latest.js"></script>
    <script type="text/javascript" src="./js/main.js"></script>
    
</html>
index.html

WebRTC学习(八)1V1音视频实时互动直播系统_WebRTC_20

main.js模拟协商过程:

'use strict'

var createOffer = document.querySelector("button#createOffer");

var pc1 = new RTCPeerConnection();        //全局变量peerconnection
var pc2 = new RTCPeerConnection();        //对端的连接

function handleError(err){
    console.err(err.name+":"+err.message);
}

function getAnswer(desc){
    console.log("Answer:");
    console.log(desc.sdp);
    pc2.setLocalDescription(desc);
    pc1.setRemoteDescription(desc);
}

function getOffer(desc){
    console.log("Offer:");
    console.log(desc.sdp);
    pc1.setLocalDescription(desc);
    pc2.setRemoteDescription(desc);    //对端设置

    //并且对于对端,需要设置Answer
    pc2.createAnswer()
            .then(getAnswer)
            .catch(handleError);
}

function getMediaStream(stream){
    stream.getTracks().forEach((track)=>{
        pc1.addTrack(track);    //直接将流(拆解为轨),添加到peerconnection中去
    });

    //添加流之后,就可以创建SDP了!!!!
    var options = {
        offerToReceiveAudio:0,
        offerToReceiveVideo:1,
        //iceRestart:true    //ture,链路发生变化,通过createoffer触发协商的重建
iceRestart:false //false,链路发生变化,不进行修改 }; pc1.createOffer(options) .then(getOffer) //设置本地描述信息setLocalDescription .catch(handleError); } //获取媒体流数据 function getStream(){ var constraints = { audio:0, video:true }; navigator.mediaDevices.getUserMedia(constraints) .then(getMediaStream) //直接将流(拆解为轨),添加到peerconnection中去 .catch(handleError); } function testOfferICEStart(){ if(!pc1){ console.error("pc is null"); return; } //如果获取了peerConnection,下面开始获取流 getStream(); } createOffer.onclick = testOfferICEStart;

3.结果测试(两次触发事件)

(1)iceRestart:false

WebRTC学习(八)1V1音视频实时互动直播系统_WebRTC_16WebRTC学习(八)1V1音视频实时互动直播系统_服务端_17
Offer:
v=0
o=- 4985865762926704574 2 IN IP4 127.0.0.1
s=-
t=0 0
a=group:BUNDLE 0
a=msid-semantic: WMS
m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 102 121 127 120 125 107 108 109 124 119 123
c=IN IP4 0.0.0.0
a=rtcp:9 IN IP4 0.0.0.0
a=ice-ufrag:0XGy
a=ice-pwd:tg7zNH02+5s57T2qxPZkE5HC
a=ice-options:trickle
a=fingerprint:sha-256 6E:80:A1:C8:84:BA:84:B6:05:23:1A:17:B0:91:07:59:B6:A8:71:4C:46:31:CE:48:52:BD:64:35:B9:2E:36:2C
a=setup:actpass
a=mid:0
a=extmap:1 urn:ietf:params:rtp-hdrext:toffset
a=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=extmap:3 urn:3gpp:video-orientation
a=extmap:4 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
a=extmap:5 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay
a=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type
a=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-timing
a=extmap:8 http://www.webrtc.org/experiments/rtp-hdrext/color-space
a=extmap:9 urn:ietf:params:rtp-hdrext:sdes:mid
a=extmap:10 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id
a=extmap:11 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id
a=sendrecv
a=msid:- c1121bb4-c8d0-41bf-b7ea-3b16b7aaf6c9
a=rtcp-mux
a=rtcp-rsize
a=rtpmap:96 VP8/90000
a=rtcp-fb:96 goog-remb
a=rtcp-fb:96 transport-cc
a=rtcp-fb:96 ccm fir
a=rtcp-fb:96 nack
a=rtcp-fb:96 nack pli
a=rtpmap:97 rtx/90000
a=fmtp:97 apt=96
a=rtpmap:98 VP9/90000
a=rtcp-fb:98 goog-remb
a=rtcp-fb:98 transport-cc
a=rtcp-fb:98 ccm fir
a=rtcp-fb:98 nack
a=rtcp-fb:98 nack pli
a=fmtp:98 profile-id=0
a=rtpmap:99 rtx/90000
a=fmtp:99 apt=98
a=rtpmap:100 VP9/90000
a=rtcp-fb:100 goog-remb
a=rtcp-fb:100 transport-cc
a=rtcp-fb:100 ccm fir
a=rtcp-fb:100 nack
a=rtcp-fb:100 nack pli
a=fmtp:100 profile-id=2
a=rtpmap:101 rtx/90000
a=fmtp:101 apt=100
a=rtpmap:102 H264/90000
a=rtcp-fb:102 goog-remb
a=rtcp-fb:102 transport-cc
a=rtcp-fb:102 ccm fir
a=rtcp-fb:102 nack
a=rtcp-fb:102 nack pli
a=fmtp:102 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001f
a=rtpmap:121 rtx/90000
a=fmtp:121 apt=102
a=rtpmap:127 H264/90000
a=rtcp-fb:127 goog-remb
a=rtcp-fb:127 transport-cc
a=rtcp-fb:127 ccm fir
a=rtcp-fb:127 nack
a=rtcp-fb:127 nack pli
a=fmtp:127 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42001f
a=rtpmap:120 rtx/90000
a=fmtp:120 apt=127
a=rtpmap:125 H264/90000
a=rtcp-fb:125 goog-remb
a=rtcp-fb:125 transport-cc
a=rtcp-fb:125 ccm fir
a=rtcp-fb:125 nack
a=rtcp-fb:125 nack pli
a=fmtp:125 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f
a=rtpmap:107 rtx/90000
a=fmtp:107 apt=125
a=rtpmap:108 H264/90000
a=rtcp-fb:108 goog-remb
a=rtcp-fb:108 transport-cc
a=rtcp-fb:108 ccm fir
a=rtcp-fb:108 nack
a=rtcp-fb:108 nack pli
a=fmtp:108 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42e01f
a=rtpmap:109 rtx/90000
a=fmtp:109 apt=108
a=rtpmap:124 red/90000
a=rtpmap:119 rtx/90000
a=fmtp:119 apt=124
a=rtpmap:123 ulpfec/90000
a=ssrc-group:FID 4120210255 1326903371
a=ssrc:4120210255 cname:tlvQZ3c4Ffi2Qkmp
a=ssrc:4120210255 msid:- c1121bb4-c8d0-41bf-b7ea-3b16b7aaf6c9
a=ssrc:4120210255 mslabel:-
a=ssrc:4120210255 label:c1121bb4-c8d0-41bf-b7ea-3b16b7aaf6c9
a=ssrc:1326903371 cname:tlvQZ3c4Ffi2Qkmp
a=ssrc:1326903371 msid:- c1121bb4-c8d0-41bf-b7ea-3b16b7aaf6c9
a=ssrc:1326903371 mslabel:-
a=ssrc:1326903371 label:c1121bb4-c8d0-41bf-b7ea-3b16b7aaf6c9

Answer:
v=0
o=- 7682877353606643392 2 IN IP4 127.0.0.1
s=-
t=0 0
a=group:BUNDLE 0
a=msid-semantic: WMS
m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 102 121 127 120 125 107 108 109 124 119 123
c=IN IP4 0.0.0.0
a=rtcp:9 IN IP4 0.0.0.0
a=ice-ufrag:QJP0
a=ice-pwd:CIu5t/Sc6Web07VrapLPbtZQ
a=ice-options:trickle
a=fingerprint:sha-256 52:67:5B:9C:54:2A:0E:83:2D:D3:94:CC:44:1D:DE:01:2A:E4:86:C6:97:88:CC:DC:AD:FF:65:E1:E1:9D:6E:BD
a=setup:active
a=mid:0
a=extmap:1 urn:ietf:params:rtp-hdrext:toffset
a=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=extmap:3 urn:3gpp:video-orientation
a=extmap:4 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
a=extmap:5 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay
a=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type
a=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-timing
a=extmap:8 http://www.webrtc.org/experiments/rtp-hdrext/color-space
a=extmap:9 urn:ietf:params:rtp-hdrext:sdes:mid
a=extmap:10 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id
a=extmap:11 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id
a=recvonly
a=rtcp-mux
a=rtcp-rsize
a=rtpmap:96 VP8/90000
a=rtcp-fb:96 goog-remb
a=rtcp-fb:96 transport-cc
a=rtcp-fb:96 ccm fir
a=rtcp-fb:96 nack
a=rtcp-fb:96 nack pli
a=rtpmap:97 rtx/90000
a=fmtp:97 apt=96
a=rtpmap:98 VP9/90000
a=rtcp-fb:98 goog-remb
a=rtcp-fb:98 transport-cc
a=rtcp-fb:98 ccm fir
a=rtcp-fb:98 nack
a=rtcp-fb:98 nack pli
a=fmtp:98 profile-id=0
a=rtpmap:99 rtx/90000
a=fmtp:99 apt=98
a=rtpmap:100 VP9/90000
a=rtcp-fb:100 goog-remb
a=rtcp-fb:100 transport-cc
a=rtcp-fb:100 ccm fir
a=rtcp-fb:100 nack
a=rtcp-fb:100 nack pli
a=fmtp:100 profile-id=2
a=rtpmap:101 rtx/90000
a=fmtp:101 apt=100
a=rtpmap:102 H264/90000
a=rtcp-fb:102 goog-remb
a=rtcp-fb:102 transport-cc
a=rtcp-fb:102 ccm fir
a=rtcp-fb:102 nack
a=rtcp-fb:102 nack pli
a=fmtp:102 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001f
a=rtpmap:121 rtx/90000
a=fmtp:121 apt=102
a=rtpmap:127 H264/90000
a=rtcp-fb:127 goog-remb
a=rtcp-fb:127 transport-cc
a=rtcp-fb:127 ccm fir
a=rtcp-fb:127 nack
a=rtcp-fb:127 nack pli
a=fmtp:127 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42001f
a=rtpmap:120 rtx/90000
a=fmtp:120 apt=127
a=rtpmap:125 H264/90000
a=rtcp-fb:125 goog-remb
a=rtcp-fb:125 transport-cc
a=rtcp-fb:125 ccm fir
a=rtcp-fb:125 nack
a=rtcp-fb:125 nack pli
a=fmtp:125 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f
a=rtpmap:107 rtx/90000
a=fmtp:107 apt=125
a=rtpmap:108 H264/90000
a=rtcp-fb:108 goog-remb
a=rtcp-fb:108 transport-cc
a=rtcp-fb:108 ccm fir
a=rtcp-fb:108 nack
a=rtcp-fb:108 nack pli
a=fmtp:108 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42e01f
a=rtpmap:109 rtx/90000
a=fmtp:109 apt=108
a=rtpmap:124 red/90000
a=rtpmap:119 rtx/90000
a=fmtp:119 apt=124
a=rtpmap:123 ulpfec/90000

Offer:
v=0
o=- 4985865762926704574 3 IN IP4 127.0.0.1
s=-
t=0 0
a=group:BUNDLE 0 1
a=msid-semantic: WMS
m=video 34352 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 102 121 127 120 125 107 108 109 124 119 123
c=IN IP4 202.199.13.135
a=rtcp:9 IN IP4 0.0.0.0
a=candidate:2289422419 1 udp 2122260223 202.199.13.135 34352 typ host generation 0 network-id 1
a=candidate:3338022051 1 tcp 1518280447 202.199.13.135 9 typ host tcptype active generation 0 network-id 1
a=ice-ufrag:0XGy
a=ice-pwd:tg7zNH02+5s57T2qxPZkE5HC
a=ice-options:trickle
a=fingerprint:sha-256 6E:80:A1:C8:84:BA:84:B6:05:23:1A:17:B0:91:07:59:B6:A8:71:4C:46:31:CE:48:52:BD:64:35:B9:2E:36:2C
a=setup:actpass
a=mid:0
a=extmap:1 urn:ietf:params:rtp-hdrext:toffset
a=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=extmap:3 urn:3gpp:video-orientation
a=extmap:4 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
a=extmap:5 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay
a=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type
a=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-timing
a=extmap:8 http://www.webrtc.org/experiments/rtp-hdrext/color-space
a=extmap:9 urn:ietf:params:rtp-hdrext:sdes:mid
a=extmap:10 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id
a=extmap:11 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id
a=sendrecv
a=msid:- c1121bb4-c8d0-41bf-b7ea-3b16b7aaf6c9
a=rtcp-mux
a=rtcp-rsize
a=rtpmap:96 VP8/90000
a=rtcp-fb:96 goog-remb
a=rtcp-fb:96 transport-cc
a=rtcp-fb:96 ccm fir
a=rtcp-fb:96 nack
a=rtcp-fb:96 nack pli
a=rtpmap:97 rtx/90000
a=fmtp:97 apt=96
a=rtpmap:98 VP9/90000
a=rtcp-fb:98 goog-remb
a=rtcp-fb:98 transport-cc
a=rtcp-fb:98 ccm fir
a=rtcp-fb:98 nack
a=rtcp-fb:98 nack pli
a=fmtp:98 profile-id=0
a=rtpmap:99 rtx/90000
a=fmtp:99 apt=98
a=rtpmap:100 VP9/90000
a=rtcp-fb:100 goog-remb
a=rtcp-fb:100 transport-cc
a=rtcp-fb:100 ccm fir
a=rtcp-fb:100 nack
a=rtcp-fb:100 nack pli
a=fmtp:100 profile-id=2
a=rtpmap:101 rtx/90000
a=fmtp:101 apt=100
a=rtpmap:102 H264/90000
a=rtcp-fb:102 goog-remb
a=rtcp-fb:102 transport-cc
a=rtcp-fb:102 ccm fir
a=rtcp-fb:102 nack
a=rtcp-fb:102 nack pli
a=fmtp:102 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001f
a=rtpmap:121 rtx/90000
a=fmtp:121 apt=102
a=rtpmap:127 H264/90000
a=rtcp-fb:127 goog-remb
a=rtcp-fb:127 transport-cc
a=rtcp-fb:127 ccm fir
a=rtcp-fb:127 nack
a=rtcp-fb:127 nack pli
a=fmtp:127 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42001f
a=rtpmap:120 rtx/90000
a=fmtp:120 apt=127
a=rtpmap:125 H264/90000
a=rtcp-fb:125 goog-remb
a=rtcp-fb:125 transport-cc
a=rtcp-fb:125 ccm fir
a=rtcp-fb:125 nack
a=rtcp-fb:125 nack pli
a=fmtp:125 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f
a=rtpmap:107 rtx/90000
a=fmtp:107 apt=125
a=rtpmap:108 H264/90000
a=rtcp-fb:108 goog-remb
a=rtcp-fb:108 transport-cc
a=rtcp-fb:108 ccm fir
a=rtcp-fb:108 nack
a=rtcp-fb:108 nack pli
a=fmtp:108 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42e01f
a=rtpmap:109 rtx/90000
a=fmtp:109 apt=108
a=rtpmap:124 red/90000
a=rtpmap:119 rtx/90000
a=fmtp:119 apt=124
a=rtpmap:123 ulpfec/90000
a=ssrc-group:FID 4120210255 1326903371
a=ssrc:4120210255 cname:tlvQZ3c4Ffi2Qkmp
a=ssrc:4120210255 msid:- c1121bb4-c8d0-41bf-b7ea-3b16b7aaf6c9
a=ssrc:4120210255 mslabel:-
a=ssrc:4120210255 label:c1121bb4-c8d0-41bf-b7ea-3b16b7aaf6c9
a=ssrc:1326903371 cname:tlvQZ3c4Ffi2Qkmp
a=ssrc:1326903371 msid:- c1121bb4-c8d0-41bf-b7ea-3b16b7aaf6c9
a=ssrc:1326903371 mslabel:-
a=ssrc:1326903371 label:c1121bb4-c8d0-41bf-b7ea-3b16b7aaf6c9
m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 102 121 127 120 125 107 108 109 124 119 123
c=IN IP4 0.0.0.0
a=rtcp:9 IN IP4 0.0.0.0
a=ice-ufrag:0XGy
a=ice-pwd:tg7zNH02+5s57T2qxPZkE5HC
a=ice-options:trickle
a=fingerprint:sha-256 6E:80:A1:C8:84:BA:84:B6:05:23:1A:17:B0:91:07:59:B6:A8:71:4C:46:31:CE:48:52:BD:64:35:B9:2E:36:2C
a=setup:actpass
a=mid:1
a=extmap:1 urn:ietf:params:rtp-hdrext:toffset
a=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=extmap:3 urn:3gpp:video-orientation
a=extmap:4 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
a=extmap:5 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay
a=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type
a=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-timing
a=extmap:8 http://www.webrtc.org/experiments/rtp-hdrext/color-space
a=extmap:9 urn:ietf:params:rtp-hdrext:sdes:mid
a=extmap:10 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id
a=extmap:11 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id
a=sendrecv
a=msid:- 0a4e60bd-bc8c-4ec2-ae3b-e48ebf68d562
a=rtcp-mux
a=rtcp-rsize
a=rtpmap:96 VP8/90000
a=rtcp-fb:96 goog-remb
a=rtcp-fb:96 transport-cc
a=rtcp-fb:96 ccm fir
a=rtcp-fb:96 nack
a=rtcp-fb:96 nack pli
a=rtpmap:97 rtx/90000
a=fmtp:97 apt=96
a=rtpmap:98 VP9/90000
a=rtcp-fb:98 goog-remb
a=rtcp-fb:98 transport-cc
a=rtcp-fb:98 ccm fir
a=rtcp-fb:98 nack
a=rtcp-fb:98 nack pli
a=fmtp:98 profile-id=0
a=rtpmap:99 rtx/90000
a=fmtp:99 apt=98
a=rtpmap:100 VP9/90000
a=rtcp-fb:100 goog-remb
a=rtcp-fb:100 transport-cc
a=rtcp-fb:100 ccm fir
a=rtcp-fb:100 nack
a=rtcp-fb:100 nack pli
a=fmtp:100 profile-id=2
a=rtpmap:101 rtx/90000
a=fmtp:101 apt=100
a=rtpmap:102 H264/90000
a=rtcp-fb:102 goog-remb
a=rtcp-fb:102 transport-cc
a=rtcp-fb:102 ccm fir
a=rtcp-fb:102 nack
a=rtcp-fb:102 nack pli
a=fmtp:102 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001f
a=rtpmap:121 rtx/90000
a=fmtp:121 apt=102
a=rtpmap:127 H264/90000
a=rtcp-fb:127 goog-remb
a=rtcp-fb:127 transport-cc
a=rtcp-fb:127 ccm fir
a=rtcp-fb:127 nack
a=rtcp-fb:127 nack pli
a=fmtp:127 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42001f
a=rtpmap:120 rtx/90000
a=fmtp:120 apt=127
a=rtpmap:125 H264/90000
a=rtcp-fb:125 goog-remb
a=rtcp-fb:125 transport-cc
a=rtcp-fb:125 ccm fir
a=rtcp-fb:125 nack
a=rtcp-fb:125 nack pli
a=fmtp:125 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f
a=rtpmap:107 rtx/90000
a=fmtp:107 apt=125
a=rtpmap:108 H264/90000
a=rtcp-fb:108 goog-remb
a=rtcp-fb:108 transport-cc
a=rtcp-fb:108 ccm fir
a=rtcp-fb:108 nack
a=rtcp-fb:108 nack pli
a=fmtp:108 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42e01f
a=rtpmap:109 rtx/90000
a=fmtp:109 apt=108
a=rtpmap:124 red/90000
a=rtpmap:119 rtx/90000
a=fmtp:119 apt=124
a=rtpmap:123 ulpfec/90000
a=ssrc-group:FID 2231752679 3089103456
a=ssrc:2231752679 cname:tlvQZ3c4Ffi2Qkmp
a=ssrc:2231752679 msid:- 0a4e60bd-bc8c-4ec2-ae3b-e48ebf68d562
a=ssrc:2231752679 mslabel:-
a=ssrc:2231752679 label:0a4e60bd-bc8c-4ec2-ae3b-e48ebf68d562
a=ssrc:3089103456 cname:tlvQZ3c4Ffi2Qkmp
a=ssrc:3089103456 msid:- 0a4e60bd-bc8c-4ec2-ae3b-e48ebf68d562
a=ssrc:3089103456 mslabel:-
a=ssrc:3089103456 label:0a4e60bd-bc8c-4ec2-ae3b-e48ebf68d562

Answer:
v=0
o=- 7682877353606643392 3 IN IP4 127.0.0.1
s=-
t=0 0
a=group:BUNDLE 0 1
a=msid-semantic: WMS
m=video 44346 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 102 121 127 120 125 107 108 109 124 119 123
c=IN IP4 202.199.13.135
a=rtcp:9 IN IP4 0.0.0.0
a=candidate:2289422419 1 udp 2122260223 202.199.13.135 44346 typ host generation 0 network-id 1
a=candidate:3338022051 1 tcp 1518280447 202.199.13.135 9 typ host tcptype active generation 0 network-id 1
a=ice-ufrag:QJP0
a=ice-pwd:CIu5t/Sc6Web07VrapLPbtZQ
a=ice-options:trickle
a=fingerprint:sha-256 52:67:5B:9C:54:2A:0E:83:2D:D3:94:CC:44:1D:DE:01:2A:E4:86:C6:97:88:CC:DC:AD:FF:65:E1:E1:9D:6E:BD
a=setup:active
a=mid:0
a=extmap:1 urn:ietf:params:rtp-hdrext:toffset
a=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=extmap:3 urn:3gpp:video-orientation
a=extmap:4 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
a=extmap:5 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay
a=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type
a=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-timing
a=extmap:8 http://www.webrtc.org/experiments/rtp-hdrext/color-space
a=extmap:9 urn:ietf:params:rtp-hdrext:sdes:mid
a=extmap:10 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id
a=extmap:11 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id
a=recvonly
a=rtcp-mux
a=rtcp-rsize
a=rtpmap:96 VP8/90000
a=rtcp-fb:96 goog-remb
a=rtcp-fb:96 transport-cc
a=rtcp-fb:96 ccm fir
a=rtcp-fb:96 nack
a=rtcp-fb:96 nack pli
a=rtpmap:97 rtx/90000
a=fmtp:97 apt=96
a=rtpmap:98 VP9/90000
a=rtcp-fb:98 goog-remb
a=rtcp-fb:98 transport-cc
a=rtcp-fb:98 ccm fir
a=rtcp-fb:98 nack
a=rtcp-fb:98 nack pli
a=fmtp:98 profile-id=0
a=rtpmap:99 rtx/90000
a=fmtp:99 apt=98
a=rtpmap:100 VP9/90000
a=rtcp-fb:100 goog-remb
a=rtcp-fb:100 transport-cc
a=rtcp-fb:100 ccm fir
a=rtcp-fb:100 nack
a=rtcp-fb:100 nack pli
a=fmtp:100 profile-id=2
a=rtpmap:101 rtx/90000
a=fmtp:101 apt=100
a=rtpmap:102 H264/90000
a=rtcp-fb:102 goog-remb
a=rtcp-fb:102 transport-cc
a=rtcp-fb:102 ccm fir
a=rtcp-fb:102 nack
a=rtcp-fb:102 nack pli
a=fmtp:102 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001f
a=rtpmap:121 rtx/90000
a=fmtp:121 apt=102
a=rtpmap:127 H264/90000
a=rtcp-fb:127 goog-remb
a=rtcp-fb:127 transport-cc
a=rtcp-fb:127 ccm fir
a=rtcp-fb:127 nack
a=rtcp-fb:127 nack pli
a=fmtp:127 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42001f
a=rtpmap:120 rtx/90000
a=fmtp:120 apt=127
a=rtpmap:125 H264/90000
a=rtcp-fb:125 goog-remb
a=rtcp-fb:125 transport-cc
a=rtcp-fb:125 ccm fir
a=rtcp-fb:125 nack
a=rtcp-fb:125 nack pli
a=fmtp:125 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f
a=rtpmap:107 rtx/90000
a=fmtp:107 apt=125
a=rtpmap:108 H264/90000
a=rtcp-fb:108 goog-remb
a=rtcp-fb:108 transport-cc
a=rtcp-fb:108 ccm fir
a=rtcp-fb:108 nack
a=rtcp-fb:108 nack pli
a=fmtp:108 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42e01f
a=rtpmap:109 rtx/90000
a=fmtp:109 apt=108
a=rtpmap:124 red/90000
a=rtpmap:119 rtx/90000
a=fmtp:119 apt=124
a=rtpmap:123 ulpfec/90000
m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 102 121 127 120 125 107 108 109 124 119 123
c=IN IP4 0.0.0.0
a=rtcp:9 IN IP4 0.0.0.0
a=ice-ufrag:QJP0
a=ice-pwd:CIu5t/Sc6Web07VrapLPbtZQ
a=ice-options:trickle
a=fingerprint:sha-256 52:67:5B:9C:54:2A:0E:83:2D:D3:94:CC:44:1D:DE:01:2A:E4:86:C6:97:88:CC:DC:AD:FF:65:E1:E1:9D:6E:BD
a=setup:active
a=mid:1
a=extmap:1 urn:ietf:params:rtp-hdrext:toffset
a=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=extmap:3 urn:3gpp:video-orientation
a=extmap:4 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
a=extmap:5 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay
a=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type
a=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-timing
a=extmap:8 http://www.webrtc.org/experiments/rtp-hdrext/color-space
a=extmap:9 urn:ietf:params:rtp-hdrext:sdes:mid
a=extmap:10 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id
a=extmap:11 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id
a=recvonly
a=rtcp-mux
a=rtcp-rsize
a=rtpmap:96 VP8/90000
a=rtcp-fb:96 goog-remb
a=rtcp-fb:96 transport-cc
a=rtcp-fb:96 ccm fir
a=rtcp-fb:96 nack
a=rtcp-fb:96 nack pli
a=rtpmap:97 rtx/90000
a=fmtp:97 apt=96
a=rtpmap:98 VP9/90000
a=rtcp-fb:98 goog-remb
a=rtcp-fb:98 transport-cc
a=rtcp-fb:98 ccm fir
a=rtcp-fb:98 nack
a=rtcp-fb:98 nack pli
a=fmtp:98 profile-id=0
a=rtpmap:99 rtx/90000
a=fmtp:99 apt=98
a=rtpmap:100 VP9/90000
a=rtcp-fb:100 goog-remb
a=rtcp-fb:100 transport-cc
a=rtcp-fb:100 ccm fir
a=rtcp-fb:100 nack
a=rtcp-fb:100 nack pli
a=fmtp:100 profile-id=2
a=rtpmap:101 rtx/90000
a=fmtp:101 apt=100
a=rtpmap:102 H264/90000
a=rtcp-fb:102 goog-remb
a=rtcp-fb:102 transport-cc
a=rtcp-fb:102 ccm fir
a=rtcp-fb:102 nack
a=rtcp-fb:102 nack pli
a=fmtp:102 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001f
a=rtpmap:121 rtx/90000
a=fmtp:121 apt=102
a=rtpmap:127 H264/90000
a=rtcp-fb:127 goog-remb
a=rtcp-fb:127 transport-cc
a=rtcp-fb:127 ccm fir
a=rtcp-fb:127 nack
a=rtcp-fb:127 nack pli
a=fmtp:127 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42001f
a=rtpmap:120 rtx/90000
a=fmtp:120 apt=127
a=rtpmap:125 H264/90000
a=rtcp-fb:125 goog-remb
a=rtcp-fb:125 transport-cc
a=rtcp-fb:125 ccm fir
a=rtcp-fb:125 nack
a=rtcp-fb:125 nack pli
a=fmtp:125 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f
a=rtpmap:107 rtx/90000
a=fmtp:107 apt=125
a=rtpmap:108 H264/90000
a=rtcp-fb:108 goog-remb
a=rtcp-fb:108 transport-cc
a=rtcp-fb:108 ccm fir
a=rtcp-fb:108 nack
a=rtcp-fb:108 nack pli
a=fmtp:108 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42e01f
a=rtpmap:109 rtx/90000
a=fmtp:109 apt=108
a=rtpmap:124 red/90000
a=rtpmap:119 rtx/90000
a=fmtp:119 apt=124
a=rtpmap:123 ulpfec/90000
iceRestart:false
Offer:
v=0
o=- 4985865762926704574 2 IN IP4 127.0.0.1
s=-
t=0 0
a=group:BUNDLE 0
a=msid-semantic: WMS
m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 102 121 127 120 125 107 108 109 124 119 123
c=IN IP4 0.0.0.0
a=rtcp:9 IN IP4 0.0.0.0
a=ice-ufrag:0XGy
a=ice-pwd:tg7zNH02+5s57T2qxPZkE5HC
a=ice-options:trickle
a=fingerprint:sha-256 6E:80:A1:C8:84:BA:84:B6:05:23:1A:17:B0:91:07:59:B6:A8:71:4C:46:31:CE:48:52:BD:64:35:B9:2E:36:2C
Answer:
v=0
o=- 7682877353606643392 2 IN IP4 127.0.0.1
s=-
t=0 0
a=group:BUNDLE 0
a=msid-semantic: WMS
m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 102 121 127 120 125 107 108 109 124 119 123
c=IN IP4 0.0.0.0
a=rtcp:9 IN IP4 0.0.0.0
a=ice-ufrag:QJP0
a=ice-pwd:CIu5t/Sc6Web07VrapLPbtZQ
a=ice-options:trickle
a=fingerprint:sha-256 52:67:5B:9C:54:2A:0E:83:2D:D3:94:CC:44:1D:DE:01:2A:E4:86:C6:97:88:CC:DC:AD:FF:65:E1:E1:9D:6E:BD
Offer:
v=0
o=- 4985865762926704574 3 IN IP4 127.0.0.1
s=-
t=0 0
a=group:BUNDLE 0 1
a=msid-semantic: WMS
m=video 34352 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 102 121 127 120 125 107 108 109 124 119 123
c=IN IP4 202.199.13.135
a=rtcp:9 IN IP4 0.0.0.0
a=candidate:2289422419 1 udp 2122260223 202.199.13.135 34352 typ host generation 0 network-id 1
a=candidate:3338022051 1 tcp 1518280447 202.199.13.135 9 typ host tcptype active generation 0 network-id 1
a=ice-ufrag:0XGy
a=ice-pwd:tg7zNH02+5s57T2qxPZkE5HC
a=ice-options:trickle
a=fingerprint:sha-256 6E:80:A1:C8:84:BA:84:B6:05:23:1A:17:B0:91:07:59:B6:A8:71:4C:46:31:CE:48:52:BD:64:35:B9:2E:36:2C
Answer:
v=0
o=- 7682877353606643392 3 IN IP4 127.0.0.1
s=-
t=0 0
a=group:BUNDLE 0 1
a=msid-semantic: WMS
m=video 44346 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 102 121 127 120 125 107 108 109 124 119 123
c=IN IP4 202.199.13.135
a=rtcp:9 IN IP4 0.0.0.0
a=candidate:2289422419 1 udp 2122260223 202.199.13.135 44346 typ host generation 0 network-id 1
a=candidate:3338022051 1 tcp 1518280447 202.199.13.135 9 typ host tcptype active generation 0 network-id 1
a=ice-ufrag:QJP0
a=ice-pwd:CIu5t/Sc6Web07VrapLPbtZQ
a=ice-options:trickle
a=fingerprint:sha-256 52:67:5B:9C:54:2A:0E:83:2D:D3:94:CC:44:1D:DE:01:2A:E4:86:C6:97:88:CC:DC:AD:FF:65:E1:E1:9D:6E:BD

(2)iceRestart:true

WebRTC学习(八)1V1音视频实时互动直播系统_WebRTC_16WebRTC学习(八)1V1音视频实时互动直播系统_服务端_17
Offer:
v=0
o=- 3039202403829553006 2 IN IP4 127.0.0.1
s=-
t=0 0
a=group:BUNDLE 0
a=msid-semantic: WMS
m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 102 121 127 120 125 107 108 109 124 119 123
c=IN IP4 0.0.0.0
a=rtcp:9 IN IP4 0.0.0.0
a=ice-ufrag:WFUz
a=ice-pwd:eXiDpDni2flIeww/A9SRhr0S
a=ice-options:trickle
a=fingerprint:sha-256 FA:8F:97:28:24:E6:F9:D6:3C:2D:74:FE:8F:67:40:3A:F0:B6:90:00:E3:E8:9D:1E:98:6B:D9:CA:01:E1:A9:0B
a=setup:actpass
a=mid:0
a=extmap:1 urn:ietf:params:rtp-hdrext:toffset
a=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=extmap:3 urn:3gpp:video-orientation
a=extmap:4 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
a=extmap:5 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay
a=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type
a=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-timing
a=extmap:8 http://www.webrtc.org/experiments/rtp-hdrext/color-space
a=extmap:9 urn:ietf:params:rtp-hdrext:sdes:mid
a=extmap:10 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id
a=extmap:11 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id
a=sendrecv
a=msid:- f5137313-a1b0-4792-ba6b-d4a1be400cdf
a=rtcp-mux
a=rtcp-rsize
a=rtpmap:96 VP8/90000
a=rtcp-fb:96 goog-remb
a=rtcp-fb:96 transport-cc
a=rtcp-fb:96 ccm fir
a=rtcp-fb:96 nack
a=rtcp-fb:96 nack pli
a=rtpmap:97 rtx/90000
a=fmtp:97 apt=96
a=rtpmap:98 VP9/90000
a=rtcp-fb:98 goog-remb
a=rtcp-fb:98 transport-cc
a=rtcp-fb:98 ccm fir
a=rtcp-fb:98 nack
a=rtcp-fb:98 nack pli
a=fmtp:98 profile-id=0
a=rtpmap:99 rtx/90000
a=fmtp:99 apt=98
a=rtpmap:100 VP9/90000
a=rtcp-fb:100 goog-remb
a=rtcp-fb:100 transport-cc
a=rtcp-fb:100 ccm fir
a=rtcp-fb:100 nack
a=rtcp-fb:100 nack pli
a=fmtp:100 profile-id=2
a=rtpmap:101 rtx/90000
a=fmtp:101 apt=100
a=rtpmap:102 H264/90000
a=rtcp-fb:102 goog-remb
a=rtcp-fb:102 transport-cc
a=rtcp-fb:102 ccm fir
a=rtcp-fb:102 nack
a=rtcp-fb:102 nack pli
a=fmtp:102 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001f
a=rtpmap:121 rtx/90000
a=fmtp:121 apt=102
a=rtpmap:127 H264/90000
a=rtcp-fb:127 goog-remb
a=rtcp-fb:127 transport-cc
a=rtcp-fb:127 ccm fir
a=rtcp-fb:127 nack
a=rtcp-fb:127 nack pli
a=fmtp:127 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42001f
a=rtpmap:120 rtx/90000
a=fmtp:120 apt=127
a=rtpmap:125 H264/90000
a=rtcp-fb:125 goog-remb
a=rtcp-fb:125 transport-cc
a=rtcp-fb:125 ccm fir
a=rtcp-fb:125 nack
a=rtcp-fb:125 nack pli
a=fmtp:125 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f
a=rtpmap:107 rtx/90000
a=fmtp:107 apt=125
a=rtpmap:108 H264/90000
a=rtcp-fb:108 goog-remb
a=rtcp-fb:108 transport-cc
a=rtcp-fb:108 ccm fir
a=rtcp-fb:108 nack
a=rtcp-fb:108 nack pli
a=fmtp:108 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42e01f
a=rtpmap:109 rtx/90000
a=fmtp:109 apt=108
a=rtpmap:124 red/90000
a=rtpmap:119 rtx/90000
a=fmtp:119 apt=124
a=rtpmap:123 ulpfec/90000
a=ssrc-group:FID 3237367520 3432067502
a=ssrc:3237367520 cname:4pvgn+mh15jc9JOc
a=ssrc:3237367520 msid:- f5137313-a1b0-4792-ba6b-d4a1be400cdf
a=ssrc:3237367520 mslabel:-
a=ssrc:3237367520 label:f5137313-a1b0-4792-ba6b-d4a1be400cdf
a=ssrc:3432067502 cname:4pvgn+mh15jc9JOc
a=ssrc:3432067502 msid:- f5137313-a1b0-4792-ba6b-d4a1be400cdf
a=ssrc:3432067502 mslabel:-
a=ssrc:3432067502 label:f5137313-a1b0-4792-ba6b-d4a1be400cdf

Answer:
v=0
o=- 5678380755551815756 2 IN IP4 127.0.0.1
s=-
t=0 0
a=group:BUNDLE 0
a=msid-semantic: WMS
m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 102 121 127 120 125 107 108 109 124 119 123
c=IN IP4 0.0.0.0
a=rtcp:9 IN IP4 0.0.0.0
a=ice-ufrag:9vGz
a=ice-pwd:ncxS/Fe/WsuHhUuaHAO9rNJx
a=ice-options:trickle
a=fingerprint:sha-256 35:27:DA:5C:E4:93:DE:88:CB:B6:AA:B9:AC:19:54:DF:8F:DF:43:38:23:7D:5F:A8:CA:F6:20:58:57:21:9F:EA
a=setup:active
a=mid:0
a=extmap:1 urn:ietf:params:rtp-hdrext:toffset
a=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=extmap:3 urn:3gpp:video-orientation
a=extmap:4 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
a=extmap:5 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay
a=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type
a=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-timing
a=extmap:8 http://www.webrtc.org/experiments/rtp-hdrext/color-space
a=extmap:9 urn:ietf:params:rtp-hdrext:sdes:mid
a=extmap:10 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id
a=extmap:11 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id
a=recvonly
a=rtcp-mux
a=rtcp-rsize
a=rtpmap:96 VP8/90000
a=rtcp-fb:96 goog-remb
a=rtcp-fb:96 transport-cc
a=rtcp-fb:96 ccm fir
a=rtcp-fb:96 nack
a=rtcp-fb:96 nack pli
a=rtpmap:97 rtx/90000
a=fmtp:97 apt=96
a=rtpmap:98 VP9/90000
a=rtcp-fb:98 goog-remb
a=rtcp-fb:98 transport-cc
a=rtcp-fb:98 ccm fir
a=rtcp-fb:98 nack
a=rtcp-fb:98 nack pli
a=fmtp:98 profile-id=0
a=rtpmap:99 rtx/90000
a=fmtp:99 apt=98
a=rtpmap:100 VP9/90000
a=rtcp-fb:100 goog-remb
a=rtcp-fb:100 transport-cc
a=rtcp-fb:100 ccm fir
a=rtcp-fb:100 nack
a=rtcp-fb:100 nack pli
a=fmtp:100 profile-id=2
a=rtpmap:101 rtx/90000
a=fmtp:101 apt=100
a=rtpmap:102 H264/90000
a=rtcp-fb:102 goog-remb
a=rtcp-fb:102 transport-cc
a=rtcp-fb:102 ccm fir
a=rtcp-fb:102 nack
a=rtcp-fb:102 nack pli
a=fmtp:102 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001f
a=rtpmap:121 rtx/90000
a=fmtp:121 apt=102
a=rtpmap:127 H264/90000
a=rtcp-fb:127 goog-remb
a=rtcp-fb:127 transport-cc
a=rtcp-fb:127 ccm fir
a=rtcp-fb:127 nack
a=rtcp-fb:127 nack pli
a=fmtp:127 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42001f
a=rtpmap:120 rtx/90000
a=fmtp:120 apt=127
a=rtpmap:125 H264/90000
a=rtcp-fb:125 goog-remb
a=rtcp-fb:125 transport-cc
a=rtcp-fb:125 ccm fir
a=rtcp-fb:125 nack
a=rtcp-fb:125 nack pli
a=fmtp:125 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f
a=rtpmap:107 rtx/90000
a=fmtp:107 apt=125
a=rtpmap:108 H264/90000
a=rtcp-fb:108 goog-remb
a=rtcp-fb:108 transport-cc
a=rtcp-fb:108 ccm fir
a=rtcp-fb:108 nack
a=rtcp-fb:108 nack pli
a=fmtp:108 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42e01f
a=rtpmap:109 rtx/90000
a=fmtp:109 apt=108
a=rtpmap:124 red/90000
a=rtpmap:119 rtx/90000
a=fmtp:119 apt=124
a=rtpmap:123 ulpfec/90000

Offer:
v=0
o=- 3039202403829553006 3 IN IP4 127.0.0.1
s=-
t=0 0
a=group:BUNDLE 0 1
a=msid-semantic: WMS
m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 102 121 127 120 125 107 108 109 124 119 123
c=IN IP4 0.0.0.0
a=rtcp:9 IN IP4 0.0.0.0
a=ice-ufrag:sVVU
a=ice-pwd:YzWnQl9V1CvdEICpngJELpYE
a=ice-options:trickle
a=fingerprint:sha-256 FA:8F:97:28:24:E6:F9:D6:3C:2D:74:FE:8F:67:40:3A:F0:B6:90:00:E3:E8:9D:1E:98:6B:D9:CA:01:E1:A9:0B
a=setup:actpass
a=mid:0
a=extmap:1 urn:ietf:params:rtp-hdrext:toffset
a=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=extmap:3 urn:3gpp:video-orientation
a=extmap:4 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
a=extmap:5 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay
a=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type
a=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-timing
a=extmap:8 http://www.webrtc.org/experiments/rtp-hdrext/color-space
a=extmap:9 urn:ietf:params:rtp-hdrext:sdes:mid
a=extmap:10 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id
a=extmap:11 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id
a=sendrecv
a=msid:- f5137313-a1b0-4792-ba6b-d4a1be400cdf
a=rtcp-mux
a=rtcp-rsize
a=rtpmap:96 VP8/90000
a=rtcp-fb:96 goog-remb
a=rtcp-fb:96 transport-cc
a=rtcp-fb:96 ccm fir
a=rtcp-fb:96 nack
a=rtcp-fb:96 nack pli
a=rtpmap:97 rtx/90000
a=fmtp:97 apt=96
a=rtpmap:98 VP9/90000
a=rtcp-fb:98 goog-remb
a=rtcp-fb:98 transport-cc
a=rtcp-fb:98 ccm fir
a=rtcp-fb:98 nack
a=rtcp-fb:98 nack pli
a=fmtp:98 profile-id=0
a=rtpmap:99 rtx/90000
a=fmtp:99 apt=98
a=rtpmap:100 VP9/90000
a=rtcp-fb:100 goog-remb
a=rtcp-fb:100 transport-cc
a=rtcp-fb:100 ccm fir
a=rtcp-fb:100 nack
a=rtcp-fb:100 nack pli
a=fmtp:100 profile-id=2
a=rtpmap:101 rtx/90000
a=fmtp:101 apt=100
a=rtpmap:102 H264/90000
a=rtcp-fb:102 goog-remb
a=rtcp-fb:102 transport-cc
a=rtcp-fb:102 ccm fir
a=rtcp-fb:102 nack
a=rtcp-fb:102 nack pli
a=fmtp:102 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001f
a=rtpmap:121 rtx/90000
a=fmtp:121 apt=102
a=rtpmap:127 H264/90000
a=rtcp-fb:127 goog-remb
a=rtcp-fb:127 transport-cc
a=rtcp-fb:127 ccm fir
a=rtcp-fb:127 nack
a=rtcp-fb:127 nack pli
a=fmtp:127 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42001f
a=rtpmap:120 rtx/90000
a=fmtp:120 apt=127
a=rtpmap:125 H264/90000
a=rtcp-fb:125 goog-remb
a=rtcp-fb:125 transport-cc
a=rtcp-fb:125 ccm fir
a=rtcp-fb:125 nack
a=rtcp-fb:125 nack pli
a=fmtp:125 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f
a=rtpmap:107 rtx/90000
a=fmtp:107 apt=125
a=rtpmap:108 H264/90000
a=rtcp-fb:108 goog-remb
a=rtcp-fb:108 transport-cc
a=rtcp-fb:108 ccm fir
a=rtcp-fb:108 nack
a=rtcp-fb:108 nack pli
a=fmtp:108 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42e01f
a=rtpmap:109 rtx/90000
a=fmtp:109 apt=108
a=rtpmap:124 red/90000
a=rtpmap:119 rtx/90000
a=fmtp:119 apt=124
a=rtpmap:123 ulpfec/90000
a=ssrc-group:FID 3237367520 3432067502
a=ssrc:3237367520 cname:4pvgn+mh15jc9JOc
a=ssrc:3237367520 msid:- f5137313-a1b0-4792-ba6b-d4a1be400cdf
a=ssrc:3237367520 mslabel:-
a=ssrc:3237367520 label:f5137313-a1b0-4792-ba6b-d4a1be400cdf
a=ssrc:3432067502 cname:4pvgn+mh15jc9JOc
a=ssrc:3432067502 msid:- f5137313-a1b0-4792-ba6b-d4a1be400cdf
a=ssrc:3432067502 mslabel:-
a=ssrc:3432067502 label:f5137313-a1b0-4792-ba6b-d4a1be400cdf
m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 102 121 127 120 125 107 108 109 124 119 123
c=IN IP4 0.0.0.0
a=rtcp:9 IN IP4 0.0.0.0
a=ice-ufrag:sVVU
a=ice-pwd:YzWnQl9V1CvdEICpngJELpYE
a=ice-options:trickle
a=fingerprint:sha-256 FA:8F:97:28:24:E6:F9:D6:3C:2D:74:FE:8F:67:40:3A:F0:B6:90:00:E3:E8:9D:1E:98:6B:D9:CA:01:E1:A9:0B
a=setup:actpass
a=mid:1
a=extmap:1 urn:ietf:params:rtp-hdrext:toffset
a=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=extmap:3 urn:3gpp:video-orientation
a=extmap:4 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
a=extmap:5 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay
a=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type
a=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-timing
a=extmap:8 http://www.webrtc.org/experiments/rtp-hdrext/color-space
a=extmap:9 urn:ietf:params:rtp-hdrext:sdes:mid
a=extmap:10 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id
a=extmap:11 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id
a=sendrecv
a=msid:- baa06592-6449-4a3c-816e-74ec95c6287c
a=rtcp-mux
a=rtcp-rsize
a=rtpmap:96 VP8/90000
a=rtcp-fb:96 goog-remb
a=rtcp-fb:96 transport-cc
a=rtcp-fb:96 ccm fir
a=rtcp-fb:96 nack
a=rtcp-fb:96 nack pli
a=rtpmap:97 rtx/90000
a=fmtp:97 apt=96
a=rtpmap:98 VP9/90000
a=rtcp-fb:98 goog-remb
a=rtcp-fb:98 transport-cc
a=rtcp-fb:98 ccm fir
a=rtcp-fb:98 nack
a=rtcp-fb:98 nack pli
a=fmtp:98 profile-id=0
a=rtpmap:99 rtx/90000
a=fmtp:99 apt=98
a=rtpmap:100 VP9/90000
a=rtcp-fb:100 goog-remb
a=rtcp-fb:100 transport-cc
a=rtcp-fb:100 ccm fir
a=rtcp-fb:100 nack
a=rtcp-fb:100 nack pli
a=fmtp:100 profile-id=2
a=rtpmap:101 rtx/90000
a=fmtp:101 apt=100
a=rtpmap:102 H264/90000
a=rtcp-fb:102 goog-remb
a=rtcp-fb:102 transport-cc
a=rtcp-fb:102 ccm fir
a=rtcp-fb:102 nack
a=rtcp-fb:102 nack pli
a=fmtp:102 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001f
a=rtpmap:121 rtx/90000
a=fmtp:121 apt=102
a=rtpmap:127 H264/90000
a=rtcp-fb:127 goog-remb
a=rtcp-fb:127 transport-cc
a=rtcp-fb:127 ccm fir
a=rtcp-fb:127 nack
a=rtcp-fb:127 nack pli
a=fmtp:127 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42001f
a=rtpmap:120 rtx/90000
a=fmtp:120 apt=127
a=rtpmap:125 H264/90000
a=rtcp-fb:125 goog-remb
a=rtcp-fb:125 transport-cc
a=rtcp-fb:125 ccm fir
a=rtcp-fb:125 nack
a=rtcp-fb:125 nack pli
a=fmtp:125 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f
a=rtpmap:107 rtx/90000
a=fmtp:107 apt=125
a=rtpmap:108 H264/90000
a=rtcp-fb:108 goog-remb
a=rtcp-fb:108 transport-cc
a=rtcp-fb:108 ccm fir
a=rtcp-fb:108 nack
a=rtcp-fb:108 nack pli
a=fmtp:108 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42e01f
a=rtpmap:109 rtx/90000
a=fmtp:109 apt=108
a=rtpmap:124 red/90000
a=rtpmap:119 rtx/90000
a=fmtp:119 apt=124
a=rtpmap:123 ulpfec/90000
a=ssrc-group:FID 3067863396 2458353845
a=ssrc:3067863396 cname:4pvgn+mh15jc9JOc
a=ssrc:3067863396 msid:- baa06592-6449-4a3c-816e-74ec95c6287c
a=ssrc:3067863396 mslabel:-
a=ssrc:3067863396 label:baa06592-6449-4a3c-816e-74ec95c6287c
a=ssrc:2458353845 cname:4pvgn+mh15jc9JOc
a=ssrc:2458353845 msid:- baa06592-6449-4a3c-816e-74ec95c6287c
a=ssrc:2458353845 mslabel:-
a=ssrc:2458353845 label:baa06592-6449-4a3c-816e-74ec95c6287c

Answer:
v=0
o=- 5678380755551815756 3 IN IP4 127.0.0.1
s=-
t=0 0
a=group:BUNDLE 0 1
a=msid-semantic: WMS
m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 102 121 127 120 125 107 108 109 124 119 123
c=IN IP4 0.0.0.0
a=rtcp:9 IN IP4 0.0.0.0
a=ice-ufrag:Ms8p
a=ice-pwd:wik63LjT92YyXqiY/v4/TjlH
a=ice-options:trickle
a=fingerprint:sha-256 35:27:DA:5C:E4:93:DE:88:CB:B6:AA:B9:AC:19:54:DF:8F:DF:43:38:23:7D:5F:A8:CA:F6:20:58:57:21:9F:EA
a=setup:active
a=mid:0
a=extmap:1 urn:ietf:params:rtp-hdrext:toffset
a=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=extmap:3 urn:3gpp:video-orientation
a=extmap:4 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
a=extmap:5 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay
a=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type
a=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-timing
a=extmap:8 http://www.webrtc.org/experiments/rtp-hdrext/color-space
a=extmap:9 urn:ietf:params:rtp-hdrext:sdes:mid
a=extmap:10 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id
a=extmap:11 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id
a=recvonly
a=rtcp-mux
a=rtcp-rsize
a=rtpmap:96 VP8/90000
a=rtcp-fb:96 goog-remb
a=rtcp-fb:96 transport-cc
a=rtcp-fb:96 ccm fir
a=rtcp-fb:96 nack
a=rtcp-fb:96 nack pli
a=rtpmap:97 rtx/90000
a=fmtp:97 apt=96
a=rtpmap:98 VP9/90000
a=rtcp-fb:98 goog-remb
a=rtcp-fb:98 transport-cc
a=rtcp-fb:98 ccm fir
a=rtcp-fb:98 nack
a=rtcp-fb:98 nack pli
a=fmtp:98 profile-id=0
a=rtpmap:99 rtx/90000
a=fmtp:99 apt=98
a=rtpmap:100 VP9/90000
a=rtcp-fb:100 goog-remb
a=rtcp-fb:100 transport-cc
a=rtcp-fb:100 ccm fir
a=rtcp-fb:100 nack
a=rtcp-fb:100 nack pli
a=fmtp:100 profile-id=2
a=rtpmap:101 rtx/90000
a=fmtp:101 apt=100
a=rtpmap:102 H264/90000
a=rtcp-fb:102 goog-remb
a=rtcp-fb:102 transport-cc
a=rtcp-fb:102 ccm fir
a=rtcp-fb:102 nack
a=rtcp-fb:102 nack pli
a=fmtp:102 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001f
a=rtpmap:121 rtx/90000
a=fmtp:121 apt=102
a=rtpmap:127 H264/90000
a=rtcp-fb:127 goog-remb
a=rtcp-fb:127 transport-cc
a=rtcp-fb:127 ccm fir
a=rtcp-fb:127 nack
a=rtcp-fb:127 nack pli
a=fmtp:127 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42001f
a=rtpmap:120 rtx/90000
a=fmtp:120 apt=127
a=rtpmap:125 H264/90000
a=rtcp-fb:125 goog-remb
a=rtcp-fb:125 transport-cc
a=rtcp-fb:125 ccm fir
a=rtcp-fb:125 nack
a=rtcp-fb:125 nack pli
a=fmtp:125 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f
a=rtpmap:107 rtx/90000
a=fmtp:107 apt=125
a=rtpmap:108 H264/90000
a=rtcp-fb:108 goog-remb
a=rtcp-fb:108 transport-cc
a=rtcp-fb:108 ccm fir
a=rtcp-fb:108 nack
a=rtcp-fb:108 nack pli
a=fmtp:108 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42e01f
a=rtpmap:109 rtx/90000
a=fmtp:109 apt=108
a=rtpmap:124 red/90000
a=rtpmap:119 rtx/90000
a=fmtp:119 apt=124
a=rtpmap:123 ulpfec/90000
m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 102 121 127 120 125 107 108 109 124 119 123
c=IN IP4 0.0.0.0
a=rtcp:9 IN IP4 0.0.0.0
a=ice-ufrag:Ms8p
a=ice-pwd:wik63LjT92YyXqiY/v4/TjlH
a=ice-options:trickle
a=fingerprint:sha-256 35:27:DA:5C:E4:93:DE:88:CB:B6:AA:B9:AC:19:54:DF:8F:DF:43:38:23:7D:5F:A8:CA:F6:20:58:57:21:9F:EA
a=setup:active
a=mid:1
a=extmap:1 urn:ietf:params:rtp-hdrext:toffset
a=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=extmap:3 urn:3gpp:video-orientation
a=extmap:4 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
a=extmap:5 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay
a=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type
a=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-timing
a=extmap:8 http://www.webrtc.org/experiments/rtp-hdrext/color-space
a=extmap:9 urn:ietf:params:rtp-hdrext:sdes:mid
a=extmap:10 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id
a=extmap:11 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id
a=recvonly
a=rtcp-mux
a=rtcp-rsize
a=rtpmap:96 VP8/90000
a=rtcp-fb:96 goog-remb
a=rtcp-fb:96 transport-cc
a=rtcp-fb:96 ccm fir
a=rtcp-fb:96 nack
a=rtcp-fb:96 nack pli
a=rtpmap:97 rtx/90000
a=fmtp:97 apt=96
a=rtpmap:98 VP9/90000
a=rtcp-fb:98 goog-remb
a=rtcp-fb:98 transport-cc
a=rtcp-fb:98 ccm fir
a=rtcp-fb:98 nack
a=rtcp-fb:98 nack pli
a=fmtp:98 profile-id=0
a=rtpmap:99 rtx/90000
a=fmtp:99 apt=98
a=rtpmap:100 VP9/90000
a=rtcp-fb:100 goog-remb
a=rtcp-fb:100 transport-cc
a=rtcp-fb:100 ccm fir
a=rtcp-fb:100 nack
a=rtcp-fb:100 nack pli
a=fmtp:100 profile-id=2
a=rtpmap:101 rtx/90000
a=fmtp:101 apt=100
a=rtpmap:102 H264/90000
a=rtcp-fb:102 goog-remb
a=rtcp-fb:102 transport-cc
a=rtcp-fb:102 ccm fir
a=rtcp-fb:102 nack
a=rtcp-fb:102 nack pli
a=fmtp:102 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001f
a=rtpmap:121 rtx/90000
a=fmtp:121 apt=102
a=rtpmap:127 H264/90000
a=rtcp-fb:127 goog-remb
a=rtcp-fb:127 transport-cc
a=rtcp-fb:127 ccm fir
a=rtcp-fb:127 nack
a=rtcp-fb:127 nack pli
a=fmtp:127 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42001f
a=rtpmap:120 rtx/90000
a=fmtp:120 apt=127
a=rtpmap:125 H264/90000
a=rtcp-fb:125 goog-remb
a=rtcp-fb:125 transport-cc
a=rtcp-fb:125 ccm fir
a=rtcp-fb:125 nack
a=rtcp-fb:125 nack pli
a=fmtp:125 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f
a=rtpmap:107 rtx/90000
a=fmtp:107 apt=125
a=rtpmap:108 H264/90000
a=rtcp-fb:108 goog-remb
a=rtcp-fb:108 transport-cc
a=rtcp-fb:108 ccm fir
a=rtcp-fb:108 nack
a=rtcp-fb:108 nack pli
a=fmtp:108 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42e01f
a=rtpmap:109 rtx/90000
a=fmtp:109 apt=108
a=rtpmap:124 red/90000
a=rtpmap:119 rtx/90000
a=fmtp:119 apt=124
a=rtpmap:123 ulpfec/90000
iceRestart:true
Offer:
v=0
o=- 3039202403829553006 2 IN IP4 127.0.0.1
s=-
t=0 0
a=group:BUNDLE 0
a=msid-semantic: WMS
m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 102 121 127 120 125 107 108 109 124 119 123
c=IN IP4 0.0.0.0
a=rtcp:9 IN IP4 0.0.0.0
a=ice-ufrag:WFUz
a=ice-pwd:eXiDpDni2flIeww/A9SRhr0S
a=ice-options:trickle
a=fingerprint:sha-256 FA:8F:97:28:24:E6:F9:D6:3C:2D:74:FE:8F:67:40:3A:F0:B6:90:00:E3:E8:9D:1E:98:6B:D9:CA:01:E1:A9:0B
Answer:
v=0
o=- 5678380755551815756 2 IN IP4 127.0.0.1
s=-
t=0 0
a=group:BUNDLE 0
a=msid-semantic: WMS
m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 102 121 127 120 125 107 108 109 124 119 123
c=IN IP4 0.0.0.0
a=rtcp:9 IN IP4 0.0.0.0
a=ice-ufrag:9vGz
a=ice-pwd:ncxS/Fe/WsuHhUuaHAO9rNJx
a=ice-options:trickle
a=fingerprint:sha-256 35:27:DA:5C:E4:93:DE:88:CB:B6:AA:B9:AC:19:54:DF:8F:DF:43:38:23:7D:5F:A8:CA:F6:20:58:57:21:9F:EA
Offer:
v=0
o=- 3039202403829553006 3 IN IP4 127.0.0.1
s=-
t=0 0
a=group:BUNDLE 0 1
a=msid-semantic: WMS
m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 102 121 127 120 125 107 108 109 124 119 123
c=IN IP4 0.0.0.0
a=rtcp:9 IN IP4 0.0.0.0
a=ice-ufrag:sVVU
a=ice-pwd:YzWnQl9V1CvdEICpngJELpYE
a=ice-options:trickle
a=fingerprint:sha-256 FA:8F:97:28:24:E6:F9:D6:3C:2D:74:FE:8F:67:40:3A:F0:B6:90:00:E3:E8:9D:1E:98:6B:D9:CA:01:E1:A9:0B

Answer:
v=0
o=- 5678380755551815756 3 IN IP4 127.0.0.1
s=-
t=0 0
a=group:BUNDLE 0 1
a=msid-semantic: WMS
m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 102 121 127 120 125 107 108 109 124 119 123
c=IN IP4 0.0.0.0
a=rtcp:9 IN IP4 0.0.0.0
a=ice-ufrag:Ms8p
a=ice-pwd:wik63LjT92YyXqiY/v4/TjlH
a=ice-options:trickle
a=fingerprint:sha-256 35:27:DA:5C:E4:93:DE:88:CB:B6:AA:B9:AC:19:54:DF:8F:DF:43:38:23:7D:5F:A8:CA:F6:20:58:57:21:9F:EA

每次点击createOffer的时候都触发每次协商的重建!!!