pion学习总结:等待传入track的一般流程
Howard Yin 2021-09-02 13:11:02 WebRTC编程框架pion实操
# 先创建设置:
// Prepare the configuration
config := webrtc.Configuration{
ICEServers: []webrtc.ICEServer{
{
URLs: []string{"stun:stun.l.google.com:19302"},
},
},
}
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 然后创建PeerConnection:
核心是NewPeerConnection
,用webrtc.NewPeerConnection
创建默认配置,或者先配置API再用api里的api.NewPeerConnection
。
// Create a new RTCPeerConnection
peerConnection, err := api.NewPeerConnection(config)
if err != nil {
panic(err)
}
defer func() {
if cErr := peerConnection.Close(); cErr != nil {
fmt.Printf("cannot close peerConnection: %v\n", cErr)
}
}()
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 配置接受传入流类型,视频or音频:
// Allow us to receive 1 audio track, and 1 video track
if _, err = peerConnection.AddTransceiverFromKind(webrtc.RTPCodecTypeAudio); err != nil {
panic(err)
} else if _, err = peerConnection.AddTransceiverFromKind(webrtc.RTPCodecTypeVideo); err != nil {
panic(err)
}
1
2
3
4
5
6
2
3
4
5
6
这里Add的Transceiver意为“收发器”,是接收器Receiver和发送器Sender的组合,它指示了这个PeerConnection可以收发什么样的流(编码格式)和方向(only收?only发?既收又发?不收不发?)。
WebRTC标准API规定的addTransceiver
差不多长这样:
let rtcTransceiver = RTCPeerConnection.addTransceiver(trackOrKind,init);
1
其中init
参数就用来指定上面说的编码格式和收发方向;trackOrKind
是表示要用什么参数生成Transceiver,可以是track或者kind(kind只有两种,audio或者video)。
在pion的实现中,因为go没有重载,所以addTransceiver
按照上面说的功能分成两个函数AddTransceiverFromKind
和AddTransceiverFromTrack
:
AddTransceiverFromKind
主要是用来做接收功能的:- kind是可接受的输入类型,必须指定
- 如果收发方向为
recvonly
或sendrecv
,那就先根据设置好的MediaEngine
(MediaEngine
的解读见《用实例学习pion -rtp-forwarder
》)创建Receiver - 如果收发方向为
sendonly
或sendrecv
,由于并没有可以发的东西。所以直接是根据kind指定的类型创建发随机数据的track然后调用AddTransceiverFromTrack
创建Sender
AddTransceiverFromTrack
主要是用来做发送功能的- track是当有连接进来的时候给他发送什么东西
- 它不支持
recvonly
,显然你都指定了track肯定是要发东西 - 如果收发方向为
sendonly
,那就直接创建Sender - 如果收发方向为
sendrecv
,那就用track的kind创建Receiver,你的track是发视频的那收也是收视频,音频同理
# 然后设置当有track传入的时候进行的操作:
peerConnection.OnTrack(func(track *webrtc.TrackRemote, receiver *webrtc.RTPReceiver) {
......
})
1
2
3
2
3
这里就可以从track
里面读数据然后进行各自操作,然后这个receiver
就是track
所绑定的Receiver,也是上面说的AddTransceiverFromKind
和AddTransceiverFromTrack
添加的Transceiver里的Receiver。关于TrackRemote
,更多解析请看pion中的TrackRemote
。
# 等待连接传入
目前为止读到的几个pion案例里都写的是只能连一次的等待方式,注释里写了正确的方法应该是用OnICECandidate
,等多看点案例再补全。