public static MediaDetails GetMediaDetails(Stream stream) { var mediaDetails = new MediaDetails(); try { stream.Seek(0, SeekOrigin.Begin); using (var info = new MI.MediaInfo()) { byte[] buffer = new byte[64 * 1024]; int bufferSize; //The size of the read file buffer //Preparing to fill MediaInfo with a buffer info.OpenBufferInit(stream.Length, 0); //The parsing loop do { //Reading data somewhere, do what you want for this. bufferSize = stream.Read(buffer, 0, 64 * 1024); //Sending the buffer to MediaInfo GCHandle gc = GCHandle.Alloc(buffer, GCHandleType.Pinned); IntPtr fromBufferIntPtr = gc.AddrOfPinnedObject(); Status result = info.OpenBufferContinue(fromBufferIntPtr, (IntPtr)bufferSize); gc.Free(); if ((result & Status.Finalized) == Status.Finalized) { break; } //Testing if MediaInfo request to go elsewhere if (info.OpenBufferContinueGoToGet() != -1) { long position = stream.Seek(info.OpenBufferContinueGoToGet(), SeekOrigin.Begin); //Position the file info.OpenBufferInit(stream.Length, position); //Informing MediaInfo we have performed the seek } } while (bufferSize > 0); // Finalizing info.OpenBufferFinalize(); //This is the end of the stream, MediaInfo must finish some work string mode = info.Get(StreamKind.Audio, 0, "BitRate_Mode"); mediaDetails.Mode = string.IsNullOrEmpty(mode) ? "CBR" : mode; mediaDetails.Bitrate = GetNullableIntValue(info, "BitRate"); mediaDetails.Channels = GetNullableIntValue(info, "Channels"); } } finally { stream.Seek(0, SeekOrigin.Begin); } return(mediaDetails); }
public static bool TryGetVersion(out string version) { try { using (var info = new MI.MediaInfo()) { version = info.Option("Info_Version"); return(true); } } catch (Exception) { version = null; return(false); } }