private void OnHeaderChanged(RTMPMessage msg) { var s = new MemoryStream(); using (s) { using (var writer = new RTMPBinaryWriter(s, true)) { writer.Write((byte)'F'); writer.Write((byte)'L'); writer.Write((byte)'V'); writer.Write((byte)1); writer.Write((byte)5); writer.WriteUInt32(9); writer.WriteUInt32(0); } if (metadata != null) { WriteMessage(s, metadata, 0xFFFFFFFF); } if (audioHeader != null) { WriteMessage(s, audioHeader, 0xFFFFFFFF); } if (videoHeader != null) { WriteMessage(s, videoHeader, 0xFFFFFFFF); } } streamIndex = TargetChannel.GenerateStreamID(); streamOrigin = DateTime.Now; timestampOrigin = msg.Timestamp; var bytes = s.ToArray(); ContentSink.OnContentHeader(new Content(streamIndex, TimeSpan.Zero, position, bytes, PCPChanPacketContinuation.None)); position += bytes.Length; }
private void WriteMessage(Stream stream, RTMPMessage msg, long time_origin) { var timestamp = Math.Max(0, msg.Timestamp - time_origin); using (var writer = new RTMPBinaryWriter(stream, true)) { writer.Write((byte)msg.MessageType); writer.WriteUInt24(msg.Body.Length); writer.WriteUInt24((int)timestamp & 0xFFFFFF); writer.Write((byte)((timestamp >> 24) & 0xFF)); writer.WriteUInt24(0); writer.Write(msg.Body, 0, msg.Body.Length); writer.Write(msg.Body.Length + 11); } }