public byte[] MultiplexFlv(Message data) { var dataBuffer = new ByteBuffer(); var buffer = new byte[4]; if (data.MessageHeader.MessageLength == 0) { var messageBuffer = new ByteBuffer(); var context = new Networking.Rtmp.Serialization.SerializationContext() { Amf0Writer = _amf0Writer, Amf3Writer = _amf3Writer, WriteBuffer = messageBuffer }; data.Serialize(context); var length = messageBuffer.Length; data.MessageHeader.MessageLength = (uint)length; var bodyBuffer = new byte[length]; messageBuffer.TakeOutMemory(bodyBuffer); dataBuffer.WriteToBuffer((byte)data.MessageHeader.MessageType); NetworkBitConverter.TryGetUInt24Bytes(data.MessageHeader.MessageLength, buffer); dataBuffer.WriteToBuffer(buffer.AsSpan(0, 3)); NetworkBitConverter.TryGetBytes(data.MessageHeader.Timestamp, buffer); dataBuffer.WriteToBuffer(buffer.AsSpan(1, 3)); dataBuffer.WriteToBuffer(buffer.AsSpan(0, 1)); buffer.AsSpan().Clear(); dataBuffer.WriteToBuffer(buffer.AsSpan(0, 3)); dataBuffer.WriteToBuffer(bodyBuffer); } else { dataBuffer.WriteToBuffer((byte)data.MessageHeader.MessageType); NetworkBitConverter.TryGetUInt24Bytes(data.MessageHeader.MessageLength, buffer); dataBuffer.WriteToBuffer(buffer.AsSpan(0, 3)); NetworkBitConverter.TryGetBytes(data.MessageHeader.Timestamp, buffer); dataBuffer.WriteToBuffer(buffer.AsSpan(1, 3)); dataBuffer.WriteToBuffer(buffer.AsSpan(0, 1)); buffer.AsSpan().Clear(); dataBuffer.WriteToBuffer(buffer.AsSpan(0, 3)); var context = new Networking.Rtmp.Serialization.SerializationContext() { Amf0Writer = _amf0Writer, Amf3Writer = _amf3Writer, WriteBuffer = dataBuffer }; data.Serialize(context); } NetworkBitConverter.TryGetBytes((data.MessageHeader.MessageLength + 11), buffer); dataBuffer.WriteToBuffer(buffer); var rawData = new byte[dataBuffer.Length]; dataBuffer.TakeOutMemory(rawData); return(rawData); }
public async Task <Message> DemultiplexFlvAsync(CancellationToken ct = default) { byte[] bodyBuffer = null; try { var header = await ReadHeader(ct); bodyBuffer = _arrayPool.Rent((int)header.MessageLength); if (!_factories.TryGetValue(header.MessageType, out var factory)) { throw new InvalidOperationException(); } await _stream.ReadBytesAsync(bodyBuffer.AsMemory(0, (int)header.MessageLength), ct); var context = new Networking.Rtmp.Serialization.SerializationContext() { Amf0Reader = _amf0Reader, Amf3Reader = _amf3Reader, ReadBuffer = bodyBuffer.AsMemory(0, (int)header.MessageLength) }; var message = factory(header, context, out var consumed); context.ReadBuffer = context.ReadBuffer.Slice(consumed); message.MessageHeader = header; message.Deserialize(context); _amf0Reader.ResetReference(); _amf3Reader.ResetReference(); return(message); } finally { if (bodyBuffer != null) { _arrayPool.Return(bodyBuffer); } } }