示例#1
0
 public FLVTag(FLVFileParser owner, byte[] binary)
 {
     this.owner     = owner;
     this.Header    = binary;
     this.Filter    = (binary[0] & 0x20) != 0;
     this.Type      = (TagType)(binary[0] & 0x1F);
     this.DataSize  = (binary[1] << 16) | (binary[2] << 8) | (binary[3]);
     this.Timestamp = (binary[7] << 24) | (binary[4] << 16) | (binary[5] << 8) | (binary[6]);
     this.StreamID  = (binary[8] << 16) | (binary[9] << 8) | (binary[10]);
     this.Body      = null;
     this.Footer    = null;
 }
示例#2
0
			public FLVTag(FLVFileParser owner, byte[] binary)
			{
				this.owner     = owner;
				this.Header    = binary;
				this.Filter    = (binary[0] & 0x20)!=0;
				this.Type      = (TagType)(binary[0] & 0x1F);
				this.DataSize  =                   (binary[1]<<16) | (binary[2]<<8) | (binary[3]);
				this.Timestamp = (binary[7]<<24) | (binary[4]<<16) | (binary[5]<<8) | (binary[6]);
				this.StreamID  =                   (binary[8]<<16) | (binary[9]<<8) | (binary[10]);
				this.Body      = null;
				this.Footer    = null;
			}
示例#3
0
            private async Task ProcessMessagesAsync(IContentSink targetSink, CancellationToken cancellationToken)
            {
                var bufferStream  = new MemoryStream();
                var context       = new FLVToMPEG2TS.Context(bufferStream);
                var contentBuffer = new MemoryStream();
                var fileParser    = new FLVFileParser();
                var msg           = await msgQueue.DequeueAsync(cancellationToken).ConfigureAwait(false);

                while (msg.Type != ContentMessage.MessageType.Stop)
                {
                    switch (msg.Type)
                    {
                    case ContentMessage.MessageType.ChannelInfo:
                        targetSink.OnChannelInfo(msg.ChannelInfo);
                        break;

                    case ContentMessage.MessageType.ChannelTrack:
                        targetSink.OnChannelTrack(msg.ChannelTrack);
                        break;

                    case ContentMessage.MessageType.ContentHeader:
                    {
                        var buffer = contentBuffer;
                        var pos    = buffer.Position;
                        buffer.Seek(0, SeekOrigin.End);
                        buffer.Write(msg.Content.Data.Span);
                        buffer.Position = pos;
                        fileParser.Read(buffer, context);
                        if (buffer.Position != 0)
                        {
                            var new_buf  = new MemoryStream();
                            var trim_pos = buffer.Position;
                            buffer.Close();
                            var buf = buffer.ToArray();
                            new_buf.Write(buf, (int)trim_pos, (int)(buf.Length - trim_pos));
                            new_buf.Position = 0;
                            contentBuffer    = new_buf;
                        }
                        if (bufferStream.Position != 0)
                        {
                            targetSink.OnContentHeader(
                                new Content(
                                    msg.Content.Stream,
                                    msg.Content.Timestamp,
                                    msg.Content.Position,
                                    bufferStream.ToArray(),
                                    msg.Content.ContFlag
                                    )
                                );
                            bufferStream.SetLength(0);
                        }
                    }
                    break;

                    case ContentMessage.MessageType.ContentBody:
                    {
                        var buffer = contentBuffer;
                        var pos    = buffer.Position;
                        buffer.Seek(0, SeekOrigin.End);
                        buffer.Write(msg.Content.Data.Span);
                        buffer.Position = pos;
                        fileParser.Read(buffer, context);
                        if (buffer.Position != 0)
                        {
                            var new_buf  = new MemoryStream();
                            var trim_pos = buffer.Position;
                            buffer.Close();
                            var buf = buffer.ToArray();
                            new_buf.Write(buf, (int)trim_pos, (int)(buf.Length - trim_pos));
                            new_buf.Position = 0;
                            contentBuffer    = new_buf;
                        }
                        if (bufferStream.Position != 0)
                        {
                            targetSink.OnContent(
                                new Content(
                                    msg.Content.Stream,
                                    msg.Content.Timestamp,
                                    msg.Content.Position,
                                    bufferStream.ToArray(),
                                    msg.Content.ContFlag
                                    )
                                );
                            bufferStream.SetLength(0);
                        }
                    }
                    break;
                    }
                    msg = await msgQueue.DequeueAsync(cancellationToken).ConfigureAwait(false);
                }
                targetSink.OnStop(msg.StopReason);
            }