Exemplo n.º 1
0
        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);
            }
        }