Yin的笔记本

vuePress-theme-reco Howard Yin    2021 - 2025
Yin的笔记本 Yin的笔记本

Choose mode

  • dark
  • auto
  • light
Home
Category
  • CNCF
  • Docker
  • namespaces
  • Kubernetes
  • Kubernetes对象
  • Linux
  • MyIdeas
  • Revolution
  • WebRTC
  • 云计算
  • 人工智能
  • 分布式
  • 图像处理
  • 图形学
  • 微服务
  • 数学
  • OJ笔记
  • 博弈论
  • 形式语言与自动机
  • 数据库
  • 服务器运维
  • 编程语言
  • C
  • Git
  • Go
  • Java
  • JavaScript
  • Python
  • Nvidia
  • Rust
  • Tex
  • Shell
  • Vue
  • 视频编解码
  • 计算机网络
  • SDN
  • 论文笔记
  • 讨论
  • 边缘计算
  • 量子信息技术
Tag
TimeLine
About
查看源码
author-avatar

Howard Yin

303

Article

153

Tag

Home
Category
  • CNCF
  • Docker
  • namespaces
  • Kubernetes
  • Kubernetes对象
  • Linux
  • MyIdeas
  • Revolution
  • WebRTC
  • 云计算
  • 人工智能
  • 分布式
  • 图像处理
  • 图形学
  • 微服务
  • 数学
  • OJ笔记
  • 博弈论
  • 形式语言与自动机
  • 数据库
  • 服务器运维
  • 编程语言
  • C
  • Git
  • Go
  • Java
  • JavaScript
  • Python
  • Nvidia
  • Rust
  • Tex
  • Shell
  • Vue
  • 视频编解码
  • 计算机网络
  • SDN
  • 论文笔记
  • 讨论
  • 边缘计算
  • 量子信息技术
Tag
TimeLine
About
查看源码
  • pion学习总结:等待传入track的一般流程

    • 先创建设置:
      • 然后创建PeerConnection:
        • 配置接受传入流类型,视频or音频:
          • 然后设置当有track传入的时候进行的操作:
            • 等待连接传入
              • 相关案例

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

              vuePress-theme-reco Howard Yin    2021 - 2025

              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

              # 然后创建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

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

              这里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

              这里就可以从track里面读数据然后进行各自操作,然后这个receiver就是track所绑定的Receiver,也是上面说的AddTransceiverFromKind和AddTransceiverFromTrack添加的Transceiver里的Receiver。关于TrackRemote,更多解析请看pion中的TrackRemote。

              # 等待连接传入

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

              # 相关案例

              • 《用实例学习pion - gocv-receive》
              • 《用实例学习pion - rtp-forwarder》
              帮助我们改善此页面!
              创建于: 2021-09-01 08:50:01

              更新于: 2021-09-02 13:11:20