/// <summary> /// Send audio data /// </summary> void SendAudio() { //Get audio data by SDK AudioPacket packet = UnityChatSDK.Instance.GetAudio(); if (packet != null) { packet.Id = ChatManager.Instance.UserID; byte[] audio = GetPbAudioPacket(packet).ToByteArray(); //UDP Send data to server if (audio != null) { UdplDataModel model = new UdplDataModel(); model.Request = UdpRequest.REQUEST_AUDIO; IMInfo info = new IMInfo(); info.UserID = ChatManager.Instance.UserID; info.CallID = ChatManager.Instance.CallID; info.UserList.Add(ChatManager.Instance.ChatPeers); model.ChatInfoData = info.ToByteArray(); model.ChatData = audio; UdpSocketManager.Instance.Send(UdpMessageCodec.Encode(model)); } } }
/// <summary> /// 发送视频数据 /// </summary> void SendVideo() { //获取SDK捕捉的视频数据 VideoPacket packet = UnityChatSDK.Instance.GetVideo(); if (packet != null) { packet.Id = ChatManager.Instance.UserID; byte[] video = GetPbVideoPacket(packet).ToByteArray(); udpPacketIndex++; List <UdpPacket> list = UdpPacketSpliter.Split(udpPacketIndex, video, ChunkLength); for (int i = 0; i < list.Count; i++) { UdplDataModel model = new UdplDataModel(); model.Request = RequestByte.REQUEST_VIDEO; CallInfo info = new CallInfo(); info.UserID = ChatManager.Instance.UserID; info.CallID = ChatManager.Instance.CallID; info.PeerList.Add(ChatManager.Instance.ChatPeerID); model.ChatInfoData = info.ToByteArray(); model.ChatData = UdpPacketEncode(list[i]); UdpSocketManager.Instance.Send(UdpMessageCodec.Encode(model)); } } }
/// <summary> /// 发送音频数据 /// </summary> void SendAudio() { //获取SDK捕捉的音频数据 AudioPacket packet = UnityChatSDK.Instance.GetAudio(); if (packet != null) { packet.Id = ChatManager.Instance.UserID; byte[] audio = GetPbAudioPacket(packet).ToByteArray(); //UDP发送数据到服务器(可更改为自己的服务器发送接口) if (audio != null) { UdplDataModel model = new UdplDataModel(); model.Request = RequestByte.REQUEST_AUDIO; CallInfo info = new CallInfo(); info.UserID = ChatManager.Instance.UserID; info.CallID = ChatManager.Instance.CallID; info.PeerList.Add(ChatManager.Instance.ChatPeerID); model.ChatInfoData = info.ToByteArray(); model.ChatData = audio; UdpSocketManager.Instance.Send(UdpMessageCodec.Encode(model)); } } }
/// <summary> /// Hang up call /// </summary> public void Hang() { if (CallID != 0) { DataModel model = new DataModel(); model.Type = ChatProtocolType.TYPE_IM; model.Request = IMProtocol.IM_HANG; IMInfo info = new IMInfo(); info.UserID = UserID; info.CallID = CallID; info.UserList.AddRange(ChatPeers); model.Message = info.ToByteArray(); ChatNetworkManager.Instance.Send(model); //send udp hang UdplDataModel udp = new UdplDataModel(); udp.Request = UdpRequest.REQUEST_HANG; udp.ChatInfoData = model.Message; byte[] udpData = UdpMessageCodec.Encode(udp); UdpSocketManager.Instance.Send(udpData); //stop udp ChatDataHandler.Instance.StopChat(); CallID = 0; ChatPeers.Clear(); isChatting = false; } }
/// <summary> /// 挂断 /// </summary> public void Hang() { if (CallID != 0) { ProtocolDataModel pd = new ProtocolDataModel(); pd.Type = ProtocolType.TYPE_IM; pd.Request = IMProtocol.IM_HANG_CRES; IMInfo info = new IMInfo(); info.PeerID = ChatPeerID; pd.Message = info.ToByteArray(); NetWorkManager.Instance.Send(pd); //send udp hang CallInfo callInfo = new CallInfo(); callInfo.CallID = CallID; UdplDataModel model = new UdplDataModel(); model.Request = RequestByte.REQUEST_HANG; model.ChatInfoData = callInfo.ToByteArray(); byte[] data = UdpMessageCodec.Encode(model); UdpSocketManager.Instance.Send(UdpMessageCodec.Encode(model)); //结束udp传输 ChatDataHandler.Instance.StopChat(); CallID = 0; } }
public void OnReceiveData(byte[] data) { try { UdplDataModel model = UdpMessageCodec.Decode(data); switch (model.Request) { case RequestByte.REQUEST_HEART: udpHeratTime = DateTime.Now; break; case RequestByte.REQUEST_AUDIO: ReceivedAudioDataQueue.Enqueue(model.ChatData); break; case RequestByte.REQUEST_VIDEO: ReceivedVideoDataQueue.Enqueue(model.ChatData); break; } } catch (Exception e) { print("ReceivedDataQueue decode error:" + e.Message + "," + e.StackTrace); } }
/// <summary> /// 编码ChatData,添加音视频的ChatPeerID和UserID /// </summary> /// <param name="data">音视频数据</param> /// <param name="res">音视类型</param> /// <returns></returns> byte[] EncodeChatDataID(byte[] data, byte res) { byte[] newByte = new byte[data.Length + 8]; Buffer.BlockCopy(BitConverter.GetBytes(ChatManager._instance.ChatPeerID), 0, newByte, 0, 4); Buffer.BlockCopy(BitConverter.GetBytes(ChatManager._instance.UserID), 0, newByte, 4, 4); Buffer.BlockCopy(data, 0, newByte, 8, data.Length); UdplDataModel model = new UdplDataModel(res, newByte); return(UdpMessageCodec.encode(model)); }
//发送udp心跳包 IEnumerator sendHeart() { print("start heart..."); while (isRunning) { yield return(new WaitForSeconds(3)); UdplDataModel model = new UdplDataModel(RequestByte.REQUEST_HEART, BitConverter.GetBytes(ChatManager._instance.UserID)); byte[] data = UdpMessageCodec.encode(model); Send(data); } print("stop heart..."); }
/// <summary> /// Send audio data /// </summary> void SendAudio() { //Get audio data by SDK AudioPacket packet = UnityChatSDK.Instance.GetAudio(); if (packet != null) { packet.Id = ChatManager.Instance.UserID; byte[] audio = GetPbAudioPacket(packet).ToByteArray(); switch (NetType) { case NetType.UdpStream: //UDP Send data to server if (audio != null) { UdplDataModel model = new UdplDataModel(); model.Request = UdpRequest.REQUEST_AUDIO; IMInfo info = new IMInfo(); info.UserID = ChatManager.Instance.UserID; info.CallID = ChatManager.Instance.CallID; info.UserList.Add(ChatManager.Instance.ChatPeers); model.ChatInfoData = info.ToByteArray(); model.ChatData = audio; UdpSocketManager.Instance.Send(UdpMessageCodec.Encode(model)); } break; case NetType.TcpStream: if (audio != null) { DataModel model = new DataModel(); model.Type = ChatProtocolType.TYPE_CHATDATA; model.Request = ChatDataProtocol.CHAT_AUDIO; model.Message = audio; ChatNetworkManager.Instance.Send(model); } break; default: break; } } }
private static void Hang() { //send udp hang CallInfo callInfo = new CallInfo(); callInfo.UserID = ConfigManager.LOCAL_ID; callInfo.CallID = ConfigManager.CALL_ID; UdplDataModel model = new UdplDataModel(); model.Request = RequestByte.REQUEST_HANG; model.ChatInfoData = callInfo.ToByteArray(); byte[] data = UdpMessageCodec.Encode(model); UdpSocketManager.Instance.Send(data); }
/// <summary> /// Send video data /// </summary> IEnumerator SendVideo() { //Get video data by SDK VideoPacket packet = UnityChatSDK.Instance.GetVideo(); if (UnityChatSDK.Instance.EnableSync) { if (packet != null) { videoPacketQueue.Enqueue(packet); } if (videoPacketQueue.Count >= UnityChatSDK.Instance.Framerate / UnityChatSDK.Instance.AudioSample) { packet = videoPacketQueue.Dequeue(); } else { yield return(null); } } if (packet != null) { packet.Id = ChatManager.Instance.UserID; byte[] video = GetPbVideoPacket(packet).ToByteArray(); udpPacketIndex++; List <UdpPacket> list = UdpPacketSpliter.Split(udpPacketIndex, video, ChunkLength); UdplDataModel model = new UdplDataModel(); model.Request = UdpRequest.REQUEST_VIDEO; IMInfo info = new IMInfo(); info.UserID = ChatManager.Instance.UserID; info.CallID = ChatManager.Instance.CallID; info.UserList.Add(ChatManager.Instance.ChatPeers); model.ChatInfoData = info.ToByteArray(); for (int i = 0; i < list.Count; i++) { model.ChatData = UdpPacketEncode(list[i]); UdpSocketManager.Instance.Send(UdpMessageCodec.Encode(model)); yield return(new WaitForSeconds(0.01f)); } } }
/// <summary> /// 发送视频数据 /// </summary> private async void SendVideo() { //获取SDK捕捉的视频数据 VideoPacket packet = await CameraHelper.Instance.GetVideo(); if (ConfigManager.ENABLE_SYNC) { if (packet != null) { videoPacketQueue.Enqueue(packet); } if (videoPacketQueue.Count >= ConfigManager.FRAME_RATE / ConfigManager.AUDIO_SAMPLE) { packet = videoPacketQueue.Dequeue(); } else { return; } } if (packet != null) { packet.Id = ConfigManager.LOCAL_ID; byte[] video = VideoPack2ProtobufPack(packet).ToByteArray(); udpPacketIndex++; List <UdpPacket> list = UdpPacketSpliter.Split(udpPacketIndex, video, ChunkLength); for (int i = 0; i < list.Count; i++) { UdplDataModel model = new UdplDataModel(); model.Request = RequestByte.REQUEST_VIDEO; CallInfo info = new CallInfo(); info.UserID = ConfigManager.LOCAL_ID; info.CallID = ConfigManager.CALL_ID; info.PeerList.Add(ConfigManager.REMOTE_ID); model.ChatInfoData = info.ToByteArray(); model.ChatData = UdpPacketEncode(list[i]); UdpSocketManager.Instance.Send(UdpMessageCodec.Encode(model)); } } }
//发送udp心跳包 IEnumerator sendHeart() { print("start heart..."); while (isRunning) { yield return(new WaitForSeconds(2)); CallInfo callInfo = new CallInfo(); callInfo.UserID = ChatManager.Instance.UserID; UdplDataModel model = new UdplDataModel(); model.ChatInfoData = callInfo.ToByteArray(); model.Request = RequestByte.REQUEST_HEART; byte[] data = UdpMessageCodec.Encode(model); Send(data); } print("stop heart..."); }
private void FixedUpdate() { if (isRunning && (DateTime.Now - UdpHeratTime).TotalSeconds > UdpOutTime) { print("udp心跳超时!!!"); ChatUIManager._instance.Hang(); } if (ReceivedDataQueue.Count > 0) { try { UdplDataModel model = UdpMessageCodec.decode(ReceivedDataQueue.Dequeue()); switch (model.Request) { case RequestByte.REQUEST_HEART: UdpHeratTime = DateTime.Now; break; case RequestByte.REQUEST_STREAM: ChatDataHandler.Instance.ReceiveStreamRemote(model.Message); break; case RequestByte.REQUEST_AUDIO: ChatDataHandler.Instance.ReceiveAudio(model.Message); break; case RequestByte.REQUEST_VIDEO: ChatDataHandler.Instance.ReceiveVideo(model.Message); break; } } catch (Exception e) { print("ReceivedDataQueue decode error:" + e.Message + "," + e.StackTrace); } } if (ReceivedDataQueue.Count > 5) { ReceivedDataQueue.Clear(); } }
//发送udp心跳包 private IEnumerator SendHeart() { Debug.Log("start heart..."); while (isRunning) { yield return(new WaitForSeconds(2)); CallInfo callInfo = new CallInfo(); // TODO callInfo.UserID = ConfigManager.LOCAL_ID; UdplDataModel model = new UdplDataModel(); model.ChatInfoData = callInfo.ToByteArray(); model.Request = RequestByte.REQUEST_HEART; byte[] data = UdpMessageCodec.Encode(model); Send(data); } Debug.Log("stop heart..."); }
//Send udp heartbeat packet IEnumerator SendHeartbeat() { print("start heartbeat..."); while (isRunning) { yield return(new WaitForSeconds(0.5f)); IMInfo info = new IMInfo(); info.UserID = ChatManager.Instance.UserID; info.CallID = ChatManager.Instance.CallID; UdplDataModel model = new UdplDataModel(); model.ChatInfoData = info.ToByteArray(); model.Request = UdpRequest.REQUEST_HEART; byte[] data = UdpMessageCodec.Encode(model); Send(data); } print("stop heartbeat..."); }
/// <summary> /// Send video data /// </summary> IEnumerator SendVideo() { //Get video data by SDK VideoPacket packet = UnityChatSDK.Instance.GetVideo(); if (UnityChatSDK.Instance.EnableSync) { if (packet != null) { videoPacketQueue.Enqueue(packet); } if (videoPacketQueue.Count >= UnityChatSDK.Instance.Framerate / UnityChatSDK.Instance.AudioSample) { packet = videoPacketQueue.Dequeue(); } else { yield return(null); } } if (packet != null) { packet.Id = ChatManager.Instance.UserID; byte[] video = GetPbVideoPacket(packet).ToByteArray(); switch (NetType) { case NetType.UdpStream: udpPacketIndex++; List <UdpPacket> list = UdpPacketSpliter.Split(udpPacketIndex, video, ChunkLength); UdplDataModel model = new UdplDataModel(); model.Request = UdpRequest.REQUEST_VIDEO; IMInfo info = new IMInfo(); info.UserID = ChatManager.Instance.UserID; info.CallID = ChatManager.Instance.CallID; info.UserList.Add(ChatManager.Instance.ChatPeers); model.ChatInfoData = info.ToByteArray(); for (int i = 0; i < list.Count; i++) { model.ChatData = UdpPacketEncode(list[i]); UdpSocketManager.Instance.Send(UdpMessageCodec.Encode(model)); yield return(new WaitForSeconds(0.01f)); } break; case NetType.TcpStream: if (video != null) { DataModel tcpVideoData = new DataModel(); tcpVideoData.Type = ChatProtocolType.TYPE_CHATDATA; tcpVideoData.Request = ChatDataProtocol.CHAT_VIDEO; tcpVideoData.Message = video; ChatNetworkManager.Instance.Send(tcpVideoData); } break; default: break; } } }