RTMP.Client.Update C# (CSharp) Method

Update() public method

public Update ( ) : void
return void
        public void Update()
        {
            if(tcpClient.Available != 0)
            {
                var buffer = new byte[tcpClient.Available];
                tcpClient.GetStream().Read(buffer, 0, buffer.Length);

                if(CurrentState == ClientStates.Handshaking)
                {
                    if(sMemory.Length < HANDSHAKE_RAND_LENGTH * 2)
                    {
                        sWriter.Write(buffer);
                        if(sMemory.Length >= HANDSHAKE_RAND_LENGTH * 2)
                        {
                            ParseS1Handshake();
                        }
                    }
                    else
                    {
                        ParseS1Handshake();
                    }
                }
                else
                {
                    var memory = new MemoryStream(buffer);
                    var reader = new EndianBinaryReader(EndianBitConverter.Big, memory);

                    while (memory.Position < memory.Length)
                    {
                        reader.ReadBytes(4); //as of now not used data
                        var bodySizeBytes = new byte[] {0, reader.ReadByte(), reader.ReadByte(), reader.ReadByte()};
                        var bodySize = converter.ToUInt32(bodySizeBytes, 0);

                        var messageId = (RtmpMessageTypeId) reader.ReadByte();
                        reader.ReadInt32(); //stream id is not needed as of now

                        switch (messageId)
                        {
                            case RtmpMessageTypeId.SetChunkSize:
                                {
                                    ParseSetChunkSize(reader.ReadInt32());
                                }
                                break;
                            case RtmpMessageTypeId.UserControlMessage:
                                {
                                    //No fawking clue why it's six bytes atm
                                    ParseUserControlMessage(reader.ReadBytes(6));
                                    if(CurrentState == ClientStates.WaitForStreamBeginControl)
                                    {
                                        //Console.WriteLine("SWITCh3");
                                        CurrentState = ClientStates.WaitForConnectResult;
                                    }
                                    if(CurrentState == ClientStates.WaitForPublishStreamBeginResult)
                                    {
                                        //Console.WriteLine("Switch6");
                                        CurrentState = ClientStates.Streaming;
                                        SendChunkSize(100);
                                    }
                                }
                                break;
                            case RtmpMessageTypeId.ServerBandwidth:
                                {
                                    if(CurrentState == ClientStates.WaitingForAcknowledge)
                                    {
                                        //Console.WriteLine("SWITCH1");
                                        SendWindowAcknowledgementSize();
                                        CurrentState = ClientStates.WaitForPeerBandwidth;
                                    }
                                    ParseServerBandwidth(reader.ReadInt32());
                                }
                                break;
                            case RtmpMessageTypeId.ClientBandwitdh:
                                {
                                    if(CurrentState == ClientStates.WaitForPeerBandwidth)
                                    {
                                        //Console.WriteLine("SWITCh2");
                                        CurrentState = ClientStates.WaitForStreamBeginControl;
                                    }
                                    ParseClientBandwidth(reader.ReadInt32(), reader.ReadByte());
                                }
                                break;
                            case RtmpMessageTypeId.Audio:
                                break;
                            case RtmpMessageTypeId.Video:
                                break;
                            case RtmpMessageTypeId.AMF3:
                                break;
                            case RtmpMessageTypeId.Invoke:
                                break;
                            case RtmpMessageTypeId.AMF0:
                                {
                                    var amfReader = new AmfReader();
                                    amfReader.Parse(reader, bodySize);

                                    if(CurrentState == ClientStates.WaitForConnectResult)
                                    {
                                        if (amfReader.amfData.Strings.Contains("_result"))
                                        {
                                            //Console.WriteLine("SWITCH4");
                                            createStream();
                                            CurrentState = ClientStates.WaitForCreateStreamResponse;
                                        }
                                    }
                                    if(CurrentState == ClientStates.WaitForCreateStreamResponse)
                                    {
                                        if (amfReader.amfData.Strings.Contains("_result"))
                                        {
                                            //Console.WriteLine("SWITCH5");
                                            publish(PublisherId);
                                            CurrentState = ClientStates.WaitForPublishStreamBeginResult;
                                        }
                                    }

                                    ParseAmf(amfReader.amfData);
                                }
                                break;
                                case RtmpMessageTypeId.Acknowledgement:
                                ParseAcknowledgement(reader.ReadInt32());
                                break;
                            default:
                                Console.WriteLine(messageId);
                                break;
                        }

                        ParseMessage(messageId, reader);
                    }
                }
            }
        }

Usage Example

Exemplo n.º 1
0
        static void Main(string[] args)
        {
            FlvStreamer streamer = new FlvStreamer();

            var client = new Client();

            client.PublisherId = "live_YourStreamID";
            client.Connect("199.9.255.53");
            client.Start();

            var vclient = new VideoClient();
            vclient.GrabVideo("http://www.youtube.com/watch?v=at68PMbgyhw");
            vclient.AddedTag += delegate(FlvTag tag)
                                    {
                                        client.SendFlv(new FlvTag[1] {tag});
                                    };

            while(true)
            {
                client.Update();
                if(client.CurrentState == Client.ClientStates.Streaming)
                    vclient.Update();
            }
        }