通过Socket传输经过RTP包装后的音视频流
Socket 发送/接收消息
start connectSocket
- new socket
- new/start 两个线程,发送和接收msg
- 初始化/配置 socket
- bindLocal
- getLocalUdpSocket
- bindCompleteCallback
- new receiverPacket
- new/start receiverTask
- socket.receiver(receiverPacket)
- offer quque
- configRemoteNetInfo(host,port)
- connect
- InetAddress.getByName(dstHost)
sendMsg
- new DatagramPacket(data, srcPos, len, inetAddress, dstPort)
- socket.send(packet)
音视频流数据走向
Audio
- 初始化RtpHandler
- sendSeqNum序列号
- lastTime
- ssrcNum = new Random().nextLong()//RTP中本次会话唯一标识符
- pyloadType音频8,视频98,用于添加RTPHeader使用
- feedPcmData:收到AudioRecord feed的数据
- 编码pcmBuffer
- 包装成RTP数据(增加对象头等)
- socket.send
中间使用RTP处理封装后,再socket发送
Video
- 先保存SPS,PPS
- 拿到Codec编码后的数据
- 处理编码数据
- 去除起始码
- 判断输入的编码数据
- key frame:Codec生成关键帧时,只有00 00 00 01 65,没有SPS,PPS。在key帧发送前再发一次;包装SPS,PPS添加RTP头,再发送
- 帧数据不满,数据最长长度,处理,发送
- 帧数据超过数据包最长长度,进行分片
- socket发送
接收流信息
Audio接收
- 判断音频数据RTP合法性
- 再解码(上传时进行了一次编码,G711)
- AudioTrack播放