/// <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));
            }
        }
    }
Exemple #2
0
    /// <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));
            }
        }
    }
Exemple #3
0
    /// <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);
        }
    }
Exemple #7
0
    /// <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));
    }
Exemple #8
0
    //发送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;
            }
        }
    }
Exemple #10
0
    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));
            }
        }
    }
Exemple #12
0
    /// <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...");
    }
Exemple #14
0
    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...");
    }
Exemple #16
0
    //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;
            }
        }
    }