<
Socket传输音视频流
>
上一篇

FFmpeg学习
下一篇

RXJava基础总结

通过Socket传输经过RTP包装后的音视频流

Socket 发送/接收消息

start connectSocket

  1. new socket
  2. new/start 两个线程,发送和接收msg
  3. 初始化/配置 socket
    1. bindLocal
      1. getLocalUdpSocket
      2. bindCompleteCallback
      3. new receiverPacket
      4. new/start receiverTask
        1. socket.receiver(receiverPacket)
        2. offer quque
    2. configRemoteNetInfo(host,port)
    3. connect
      1. InetAddress.getByName(dstHost)

sendMsg

  1. new DatagramPacket(data, srcPos, len, inetAddress, dstPort)
  2. socket.send(packet)

音视频流数据走向

Audio

  1. 初始化RtpHandler
    1. sendSeqNum序列号
    2. lastTime
    3. ssrcNum = new Random().nextLong()//RTP中本次会话唯一标识符
    4. pyloadType音频8,视频98,用于添加RTPHeader使用
  2. feedPcmData:收到AudioRecord feed的数据
    1. 编码pcmBuffer
    2. 包装成RTP数据(增加对象头等)
  3. socket.send 中间使用RTP处理封装后,再socket发送

Video

  1. 先保存SPS,PPS
  2. 拿到Codec编码后的数据
  3. 处理编码数据
    1. 去除起始码
    2. 判断输入的编码数据
      1. key frame:Codec生成关键帧时,只有00 00 00 01 65,没有SPS,PPS。在key帧发送前再发一次;包装SPS,PPS添加RTP头,再发送
      2. 帧数据不满,数据最长长度,处理,发送
      3. 帧数据超过数据包最长长度,进行分片
  4. socket发送

接收流信息

Audio接收

  1. 判断音频数据RTP合法性
  2. 再解码(上传时进行了一次编码,G711)
  3. AudioTrack播放
Top
Foot