pion学习总结:等待传入track的一般流程

先创建设置: // Prepare the configuration config := webrtc.Configuration{ ICEServers: []webrtc.ICEServer{ { URLs: []string{"stun:stu

先创建设置:

// Prepare the configuration
config := webrtc.Configuration{
    ICEServers: []webrtc.ICEServer{
        {
            URLs: []string{"stun:stun.l.google.com:19302"},
        },
    },
}

然后创建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)
    }
}()

配置接受传入流类型,视频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)
}

这里Add的Transceiver意为“收发器”,是接收器Receiver和发送器Sender的组合,它指示了这个PeerConnection可以收发什么样的流(编码格式)和方向(only收?only发?既收又发?不收不发?)。

WebRTC标准API规定的addTransceiver差不多长这样:

let rtcTransceiver = RTCPeerConnection.addTransceiver(trackOrKind,init);

其中init参数就用来指定上面说的编码格式和收发方向;trackOrKind是表示要用什么参数生成Transceiver,可以是track或者kind(kind只有两种,audio或者video)。

在pion的实现中,因为go没有重载,所以addTransceiver按照上面说的功能分成两个函数AddTransceiverFromKindAddTransceiverFromTrack

  • AddTransceiverFromKind主要是用来做接收功能的:

    • kind是可接受的输入类型,必须指定

    • 如果收发方向为recvonlysendrecv,那就先根据设置好的MediaEngine创建Receiver

    • 如果收发方向为sendonlysendrecv,由于并没有可以发的东西。所以直接是根据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) {
    ......
})

这里就可以从track里面读数据然后进行各自操作,然后这个receiver就是track所绑定的Receiver,也是上面说的AddTransceiverFromKindAddTransceiverFromTrack添加的Transceiver里的Receiver。

等待连接传入

目前为止读到的几个pion案例里都写的是只能连一次的等待方式,注释里写了正确的方法应该是用OnICECandidate

LICENSED UNDER CC BY-NC-SA 4.0
Comment