/// <summary> /// Add video stream to VideoStreams object /// </summary> /// <param name="am"> /// A <see cref="AviManager"/> /// </param> /// <param name="j"> /// A <see cref="System.Int32"/> /// </param> private void AddVideoStream(ref AviManager am, int j) { double WdH = 0; AviVideoStreamEntity vStream = new AviVideoStreamEntity(); long totalTime = 0; vStream.CodecDesc = byteMan.GetFourccFromInt((uint)am.AviContainer.AviStreams[j].AviStreamHeader.FccHandler); vStream.FrameSize = am.AviContainer.AviStreams[j].AviVideoStreamHeader[0].BiWidth + " x " + am.AviContainer.AviStreams[j].AviVideoStreamHeader[0].BiHeight; if (am.AviContainer.AviHeader.DwMicroSecPerFrame > 0) { totalTime =(long)((long)am.AviContainer.AviHeader.DwTotalFrames * (long)am.AviContainer.AviHeader.DwMicroSecPerFrame); } vStream.TotalTime = totalTime; vStream.FrameRate = Convert.ToInt32(1000000.0 / am.AviContainer.AviHeader.DwMicroSecPerFrame); vStream.TotalFrame = (long)am.AviContainer.AviHeader.DwTotalFrames; vStream.DataRate = (long)(am.AviContainer.AviStreams[j].AviStreamHeader.DwRate / am.AviContainer.AviStreams[j].AviStreamHeader.DwScale); // Calc Video Bitrate WdH = am.AviContainer.AviStreams[j].AviVideoStreamHeader[0].BiWidth; WdH /= am.AviContainer.AviStreams[j].AviVideoStreamHeader[0].BiHeight; int headerSize = am.AviContainer.AviHeader.DwTotalFrames * 8 * (am.AviContainer.AudioStreams.Count + 1); long videoSize = (long)(am.AviContainer.MoviSize - headerSize - audioSize); double AverageVideoBitRate = ((double)(videoSize * vStream.DataRate * 8) / (am.AviContainer.AviHeader.DwTotalFrames * 1000)); // double videoQuality = (double)((0.75 * WdH) * // (double)(AverageVideoBitRate / vStream.DataRate)); double videoQuality = (double)((0.75 * WdH * AverageVideoBitRate) / vStream.DataRate); vStream.CodecName = byteMan.GetFourccFromInt((uint)am.AviContainer.AviStreams[j].AviVideoStreamHeader[0].BiCompression); vStream.VideoBitrate = AverageVideoBitRate.ToString("#,##0") + " Kb/Sec"; vStream.PacketBitstream = am.AviContainer.PBitstream; vStream.Quality = (long)videoQuality; am.AviContainer.VideoStreams.Add(vStream); }
/// <summary> /// Scan file and return info /// </summary> /// <param name="filePath"> /// A <see cref="System.String"/> File path to scan /// </param> /// <param name="vInfo"> /// A <see cref="Object"/> Output video stream info /// </param> /// <param name="aInfo"> /// A <see cref="Object"/> Output audio stream info /// </param> public void GetFileInfo(string filePath, ref object vInfo, ref object aInfo) { int vStreams = 0; int aStreams = 0; if (!IsManaged(filePath)) { throw new Exception("UNMANAGED EXTENSION"); } // Create instance of Manager class am = new AviManager(filePath); // Scan file am.GetInfo(); // Parse audio streams for (int j=0; j<am.AviContainer.AviStreams.Count; j++) { if (am.AviContainer.AviStreams[j].AviStreamHeader.FccType == AviConstants.StreamtypeAUDIO) { // Audio Stream AddAudioStream(ref am, j); aStreams++; // Calc stream size and add to total audio size int blockPerSec = am.AviContainer.AviStreams[j].AviStreamHeader.DwRate / am.AviContainer.AviStreams[j].AviStreamHeader.DwScale; double tmpAudio = am.AviContainer.AviStreams[j].AviStreamHeader.DwLength; tmpAudio *= am.AviContainer.AviStreams[j].AviAudioStreamHeader[0].NAvgBytesPerSec; tmpAudio /= blockPerSec; audioSize += tmpAudio; } } // Parse video streams for (int j=0; j<am.AviContainer.AviStreams.Count; j++) { if (am.AviContainer.AviStreams[j].AviStreamHeader.FccType == AviConstants.StreamtypeVIDEO) { // Video Stream AddVideoStream(ref am, j); vStreams ++; } } #region Video List update ((List<string[]>)vInfo).Add( new string[] {"Codec name:", am.AviContainer.VideoStreams[0].CodecName} ); ((List<string[]>)vInfo).Add( new string[] {"Codec desc:", am.AviContainer.VideoStreams[0].CodecDesc} ); ((List<string[]>)vInfo).Add( new string[] {"Frame size:", am.AviContainer.VideoStreams[0].FrameSize} ); ((List<string[]>)vInfo).Add( new string[] {"Average video bitrate:", am.AviContainer.VideoStreams[0].VideoBitrate} ); ((List<string[]>)vInfo).Add( new string[] {"File size:", ((am.AviContainer.FileSize) / 1024).ToString("#,### KB") } ); long ttime = (long)(am.AviContainer.VideoStreams[0].TotalTime / 1000000.0); int hours = (int)(ttime / 3600); ttime -= (long)(hours * 3600); int mins = (int)(ttime / 60); ttime -= (long)(mins * 60); ((List<string[]>)vInfo).Add( new string[] {"Total time:", String.Format("{0:00}:{1:00}:{2:00.00#} seconds", hours, mins, ttime)} ); ((List<string[]>)vInfo).Add( new string[] {"Frame rate:", String.Format("{0:N2} frames/sec", am.AviContainer.VideoStreams[0].FrameRate)} ); ((List<string[]>)vInfo).Add( new string[] {"Total frames:", am.AviContainer.VideoStreams[0].TotalFrame.ToString("#,##0") } ); ((List<string[]>)vInfo).Add( new string[] {"Video data rate:", am.AviContainer.VideoStreams[0].DataRate.ToString() + " frames/sec" } ); ((List<string[]>)vInfo).Add( new string[] {"Video quality:", am.AviContainer.VideoStreams[0].Quality.ToString("#,##0.##")} ); ((List<string[]>)vInfo).Add( new string[] {"Packet Bitstream:", am.AviContainer.VideoStreams[0].PacketBitstream.ToString()} ); // ISFT Data for(int k=0; k<am.AviContainer.ISFTData.Count; k++) { ((List<string[]>)vInfo).Add( new string[] {"ISFT data:", am.AviContainer.ISFTData[0]} ); } // JUNK Data for(int k=0; k<am.AviContainer.JunkData.Count; k++) { ((List<string[]>)vInfo).Add( new string[] {"JUNK data:", am.AviContainer.JunkData[0]} ); } // USER Data for(int k=0; k<am.AviContainer.MoviUserData.Count; k++) { ((List<string[]>)vInfo).Add( new string[] {"USER data:", am.AviContainer.MoviUserData[0]} ); } #endregion Video List update #region Audio List update for(int k=0; k<am.AviContainer.AudioStreams.Count; k++) { AviAudioStreamEntity ase = am.AviContainer.AudioStreams[k]; string streamDescInfo = "Audio " + (k+1).ToString("d2") + ":"; string streamValueInfo = ase.StreamType + " " + ase.Bitrate + " - " + ase.Hz.ToString() + " Hz (" + ase.Channels.ToString() + " Channels)"; ((List<string[]>)aInfo).Add( new string[] {streamDescInfo, streamValueInfo} ); } #endregion Audio List update }
/// <summary> /// Add audio stream to AudioStreams object /// </summary> /// <param name="am"> /// A <see cref="AviManager"/> /// </param> /// <param name="j"> /// A <see cref="System.Int32"/> /// </param> private void AddAudioStream(ref AviManager am, int j) { AviAudioStreamEntity aStream = new AviAudioStreamEntity(); string aFormat = am.AviContainer.AviStreams[j].AviAudioStreamHeader[0].WFormatTag.ToString("X4"); double audioRate = (8.0 * am.AviContainer.AviStreams[j].AviAudioStreamHeader[0].NAvgBytesPerSec); aStream.Bitrate = String.Format("{0:N2} Kb/Sec", audioRate / 1000.0); aStream.Channels = (int)am.AviContainer.AviStreams[j].AviAudioStreamHeader[0].NChannels; aStream.Hz = am.AviContainer.AviStreams[j].AviAudioStreamHeader[0].NSamplesPerSec; aStream.Code = aFormat; aStream.StreamType = am.GetAudioType(aFormat); am.AviContainer.AudioStreams.Add(aStream); }