private MinecraftPacket GetPacket(int id, bool serverbound) { try { return(Packets.First(x => x.Id == id && x.State == state && x.Serverbound == serverbound)); } catch { Console.WriteLine("Coudnt Find Packet 0x" + id.ToString("X")); throw; } }
public void FixMetadata() { if (Metadata == null) { logger.Log("No metadata packet found. Creating new."); Metadata = new MetadataPacket(FLVHeader.HEADER_SIZE); Packets.Insert(0, Metadata); } // remove meaningless stuff Metadata.Variables.Remove("metadatacreator"); Metadata.Variables.Remove("creationdate"); Metadata.Variables.Remove("metadatadate"); Metadata.Variables.Remove("datasize"); Metadata.Variables.Remove("videodatarate"); Metadata.Variables.Remove("audiodatarate"); // lil` improvement Metadata.Variables["canSeekToEnd"] = true; // latest frame TimeSpan maxTimeStamp = Packets.Max(e => e.TimeStamp); // update seeking fields Metadata.Variables["duration"] = maxTimeStamp.TotalSeconds; Metadata.Variables["lasttimestamp"] = maxTimeStamp.TotalSeconds; // update last key frame, if possible BasePacket lastKeyFrame = Packets.LastOrDefault(e => e.PacketType == PacketType.VideoPayload && ((VideoPacket)e).FrameType == VideoFrameType.KeyFrame); if (lastKeyFrame != null) { Metadata.Variables["lastkeyframetimestamp"] = lastKeyFrame.TimeStamp.TotalSeconds; } logger.Log(" -- Video duration: {0} seconds", maxTimeStamp.TotalSeconds); // first audio/video packets VideoPacket videoPacket = (VideoPacket)Packets.First(e => e.PacketType == PacketType.VideoPayload); AudioPacket audioPacket = (AudioPacket)Packets.FirstOrDefault(e => e.PacketType == PacketType.AudioPayload); if (audioPacket == null) { Header.Flags &= ~FLVFlags.Audio; Metadata.Variables.Remove("audiosamplerate"); Metadata.Variables.Remove("audiosamplesize"); Metadata.Variables.Remove("stereo"); Metadata.Variables.Remove("audiocodecid"); Metadata.Variables.Remove("audiodelay"); Metadata.Variables.Remove("audiosize"); logger.Log(" -- Audio: no"); } else { // update audio data Metadata.Variables["audiosamplerate"] = audioPacket.GetSampleRate(); Metadata.Variables["audiosamplesize"] = audioPacket.GetSoundSize(); Metadata.Variables["stereo"] = audioPacket.GetStereo(); Metadata.Variables["audiocodecid"] = audioPacket.GetSoundFormat(); Metadata.Variables["audiodelay"] = videoPacket.TimeStamp.TotalSeconds; Metadata.Variables["audiosize"] = (double)AudioDataBytes; logger.Log( " -- Audio: {0} Hz {1} bits {2} Codec: {3} Delay {4} sec", audioPacket.GetSampleRate(), audioPacket.GetSoundSize(), audioPacket.GetStereo() ? "stereo" : "mono", audioPacket.SoundFormat, videoPacket.TimeStamp.TotalSeconds ); } // update video data Metadata.Variables["videosize"] = (double)VideoDataBytes; Metadata.Variables["videocodecid"] = videoPacket.GetCodecId(); logger.Log(" -- Video codec: {0}", videoPacket.CodecId); videoPacket = (VideoPacket)Packets.FirstOrDefault(e => e.PacketType == PacketType.VideoPayload && ((VideoPacket)e).Width > 0 && ((VideoPacket)e).Height > 0); if (videoPacket != null) { Metadata.Variables["width"] = (double)videoPacket.Width; Metadata.Variables["height"] = (double)videoPacket.Height; logger.Log(" -- Video dimensions: {0}x{1}", videoPacket.Width, videoPacket.Height); } }