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); } } }