返回首页


,按1996-1997年,连同Internet Explorer 3.0中,微软发布API来使用媒体内容(例如电影)。他们称之为石英。这是非常方便的接口集,并因此被广泛用于工业。现在我们把它的DirectShow。多年过去了,但DirectShow中保持不变。它的工作,工作非常好。一个几年前微软的夫妇决定需要改变,并开始设计新的基于COM的多媒体框架为Windows Vista,7日和8日。他们把它叫做媒体基金会。这个框架是更通用的和可扩展性,但​​也更复杂得多。今天我们将学习如何检测使用到的DirectShow SDK相比媒体基金会编解码器的视频或音频文件的信息。所以让我们开始
{S0的}如何使用DirectShow媒体文件的编解码器检测
这一个很简单的。创建新的实例媒体探测器

var mediaDet = (IMediaDet)new MediaDet();

把你的文件里面{C}
枚举媒体流内
int streamCount;     

hr = mediaDet.get_OutputStreams(out streamCount);

获取每个流{体C3}
检测它的类型{的C4}
,如果视频类型,得到和解密{C5的}
你也可以获取流的长度和检索其他属性。{5233}
什么有关管理这个API的签名?这里没有问题,它是作为奖金FOURCC解码器{C7-}
看起来很简单吗?这是。但是有两个问题。其一是由微软所有这些接口{A}。第二(这大概是DirectShow的弃用的原因),这不是真正的可扩展的接口。现在让我们看看它是如何在媒体基金会完成。如何通过媒体基金会的媒体文件的编解码器检测
首先我们需要创建解析器源{C8的}
然后创建实际的解析器对象
当我们拥有它,我们需要创建描述。 {C10的}
现在我们有一切流计算和检索流。{C11的}
让我们有格式的类型处理{C12的}
,然后实际的媒体类型和解码器的代码
hr = MFCreateMFVideoFormatFromMFMediaType(type, out format, out size));     

var fourCC = FourCCToString(format.surfaceInfo.Format);

看起来比DirectShow的方法更复杂。让我们来看看实际interp定义。
[DllImport("mfplat.dll", ExactSpelling = true, PreserveSig = false)]     

public static extern void MFShutdown();

[DllImport("mfplat.dll", ExactSpelling = true, PreserveSig = false)]     

public static extern void MFStartup(int Version, MFSTARTUP dwFlags);

[DllImport("mfplat.dll", ExactSpelling = true, PreserveSig = false)]     

public static extern int MFCreateMFVideoFormatFromMFMediaType([In] IMFMediaType pMFType, out MFVIDEOFORMAT ppMFVF, out int pcbSize);      

      

[DllImport("mf.dll", ExactSpelling = true, PreserveSig = false)]      

public static extern int MFCreateSourceResolver(out IMFSourceResolver ppISourceResolver);

[DllImport("mf.dll", ExactSpelling = true, PreserveSig = false)]     

public static extern void MFGetService([In, MarshalAs(UnmanagedType.Interface)] object punkObject, [In, MarshalAs(UnmanagedType.LPStruct)] Guid guidService, [In, MarshalAs(UnmanagedType.LPStruct)] Guid riid, [Out, MarshalAs(UnmanagedType.Interface)] out object ppvObject);

#region INTERFACES

[ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("FBE5A32D-A497-4B61-BB85-97B1A848A6E3")]     

public interface IMFSourceResolver {      

   int CreateObjectFromURL([In, MarshalAs(UnmanagedType.LPWStr)] string pwszURL, [In] MFResolution dwFlags, IPropertyStore pProps, out MF_OBJECT_TYPE pObjectType, [MarshalAs(UnmanagedType.IUnknown)] out object ppObject);

   int CreateObjectFromByteStream([In, MarshalAs(UnmanagedType.Interface)] IMFByteStream pByteStream, [In, MarshalAs(UnmanagedType.LPWStr)] string pwszURL, [In] MFResolution dwFlags, [In, MarshalAs(UnmanagedType.Interface)] IPropertyStore pProps, out MF_OBJECT_TYPE pObjectType, [MarshalAs(UnmanagedType.IUnknown)] out object ppObject);

   int BeginCreateObjectFromURL([In, MarshalAs(UnmanagedType.LPWStr)] string pwszURL, MFResolution dwFlags, IPropertyStore pProps, [MarshalAs(UnmanagedType.IUnknown)] out object ppIUnknownCancelCookie, IMFAsyncCallback pCallback, [In, MarshalAs(UnmanagedType.IUnknown)] object punkState);

   int EndCreateObjectFromURL(IMFAsyncResult pResult, out MF_OBJECT_TYPE pObjectType, [MarshalAs(UnmanagedType.Interface)] out object ppObject);

   int BeginCreateObjectFromByteStream([In, MarshalAs(UnmanagedType.Interface)] IMFByteStream pByteStream, [In, MarshalAs(UnmanagedType.LPWStr)] string pwszURL, [In] MFResolution dwFlags, IPropertyStore pProps, [MarshalAs(UnmanagedType.IUnknown)] out object ppIUnknownCancelCookie, IMFAsyncCallback pCallback, [MarshalAs(UnmanagedType.IUnknown)] object punkState);

   int EndCreateObjectFromByteStream(IMFAsyncResult pResult, out MF_OBJECT_TYPE pObjectType, [MarshalAs(UnmanagedType.IUnknown)] out object ppObject);

   int CancelObjectCreation([In, MarshalAs(UnmanagedType.IUnknown)] object pIUnknownCancelCookie);     

}

[ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("AD4C1B00-4BF7-422F-9175-756693D9130D")]     

public interface IMFByteStream {      

   void GetCapabilities(out MFBYTESTREAM pdwCapabilities);

   void GetLength(out long pqwLength);

   void SetLength([In] long qwLength);

   void GetCurrentPosition(out long pqwPosition);

   void SetCurrentPosition([In] long qwPosition);

   void IsEndOfStream([MarshalAs(UnmanagedType.Bool)] out bool pfEndOfStream);

   void Read(IntPtr pb, [In] int cb, out int pcbRead);

   void BeginRead(IntPtr pb, [In] int cb, [In, MarshalAs(UnmanagedType.Interface)] IMFAsyncCallback pCallback, [In, MarshalAs(UnmanagedType.IUnknown)] object pUnkState);

   void EndRead([In, MarshalAs(UnmanagedType.Interface)] IMFAsyncResult pResult, out int pcbRead);

   void Write(IntPtr pb, [In] int cb, out int pcbWritten);

   void BeginWrite(IntPtr pb, [In] int cb, [In, MarshalAs(UnmanagedType.Interface)] IMFAsyncCallback pCallback, [In, MarshalAs(UnmanagedType.IUnknown)] object pUnkState);

   void EndWrite([In, MarshalAs(UnmanagedType.Interface)] IMFAsyncResult pResult, out int pcbWritten);

   void Seek([In] MFBYTESTREAM_SEEK_ORIGIN SeekOrigin, [In] long llSeekOffset, [In] MFBYTESTREAM_SEEK_FLAG dwSeekFlags, out long pqwCurrentPosition);

   void Flush();

   void Close();     

}

[ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("886D8EEB-8CF2-4446-8D02-CDBA1DBDCF99")]     

public interface IPropertyStore {      

   [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]      

   void GetCount(out uint cProps);

   [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]     

   void GetAt([In] uint iProp, out PROPERTYKEY pkey);

   [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]     

   void GetValue([In] PROPERTYKEY key, out PROPVARIANT pv);

   [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]     

   void SetValue([In] PROPERTYKEY key, [In] ref PROPVARIANT  pv);

   [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]     

   void Commit();      

}

[ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("A27003CF-2354-4F2A-8D6A-AB7CFF15437E")]     

public interface IMFAsyncCallback {      

   void GetParameters(out MFASYNC pdwFlags, out MFASYNC_CALLBACK_QUEUE pdwQueue);

   void Invoke([In, MarshalAs(UnmanagedType.Interface)] IMFAsyncResult pAsyncResult);     

}

[ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("AC6B7889-0740-4D51-8619-905994A55CC6")]     

public interface IMFAsyncResult {      

   void GetState([MarshalAs(UnmanagedType.IUnknown)] out object ppunkState);

   [PreserveSig]     

   int GetStatus();

   void SetStatus([In, MarshalAs(UnmanagedType.Error)] int hrStatus);

   void GetObject([MarshalAs(UnmanagedType.Interface)] out object ppObject);

   [PreserveSig]     

   IntPtr GetStateNoAddRef();      

}

[ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("DF598932-F10C-4E39-BBA2-C308F101DAA3")]     

public interface IMFMediaEvent : IMFAttributes {      

   #region IMFAttributes methods

   new void GetItem([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, IntPtr pValue);

   new void GetItemType([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, out MF_ATTRIBUTE_TYPE pType);

   new void CompareItem([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, IntPtr Value, [MarshalAs(UnmanagedType.Bool)] out bool pbResult);

   new void Compare([MarshalAs(UnmanagedType.Interface)] IMFAttributes pTheirs, MF_ATTRIBUTES_MATCH_TYPE MatchType, [MarshalAs(UnmanagedType.Bool)] out bool pbResult);

   new void GetUINT32([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, out int punValue);

   new void GetUINT64([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, out long punValue);

   new void GetDouble([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, out double pfValue);

   new void GetGUID([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, out Guid pguidValue);

   new void GetStringLength([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, out int pcchLength);

   new void GetString([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, [Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pwszValue, int cchBufSize, out int pcchLength);

   new void GetAllocatedString([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, [MarshalAs(UnmanagedType.LPWStr)] out string ppwszValue, out int pcchLength);

   new void GetBlobSize([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, out int pcbBlobSize);

   new void GetBlob([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, [Out, MarshalAs(UnmanagedType.LPArray)] byte[] pBuf, int cbBufSize, out int pcbBlobSize);

   // Use GetBlob instead of this     

   new void GetAllocatedBlob([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, out IntPtr ip, out int pcbSize);

   new void GetUnknown([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, [In, MarshalAs(UnmanagedType.LPStruct)] Guid riid, [MarshalAs(UnmanagedType.IUnknown)] out object ppv);

   new void SetItem([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, IntPtr Value);

   new void DeleteItem([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey);

   new void DeleteAllItems();

   new void SetUINT32([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, int unValue);

   new void SetUINT64([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, long unValue);

   new void SetDouble([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, double fValue);

   new void SetGUID([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, [In, MarshalAs(UnmanagedType.LPStruct)] Guid guidValue);

   new void SetString([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, [In, MarshalAs(UnmanagedType.LPWStr)] string wszValue);

   new void SetBlob([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, [In, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2)] byte[] pBuf, int cbBufSize);

   new void SetUnknown([MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, [In, MarshalAs(UnmanagedType.IUnknown)] object pUnknown);

   new void LockStore();

   new void UnlockStore();

   new void GetCount(out int pcItems);

   new void GetItemByIndex(int unIndex, out Guid pguidKey, IntPtr pValue);

   new void CopyAllItems([In, MarshalAs(UnmanagedType.Interface)] IMFAttributes pDest);

   #endregion     

   void GetType(out MediaEventType pmet);

   void GetExtendedType(out Guid pguidExtendedType);

   void GetStatus([MarshalAs(UnmanagedType.Error)] out int phrStatus);

   void GetValue([In, Out] ref object pvValue);     

}

[ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("03CB2711-24D7-4DB6-A17F-F3A7A479A536")]     

public interface IMFPresentationDescriptor : IMFAttributes {

   #region IMFAttributes methods

   new void GetItem([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, IntPtr pValue);

   new void GetItemType([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, out MF_ATTRIBUTE_TYPE pType);

   new void CompareItem([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, IntPtr Value, [MarshalAs(UnmanagedType.Bool)] out bool pbResult);

   new void Compare([MarshalAs(UnmanagedType.Interface)] IMFAttributes pTheirs, MF_ATTRIBUTES_MATCH_TYPE MatchType, [MarshalAs(UnmanagedType.Bool)] out bool pbResult);

   new void GetUINT32([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, out int punValue);

   new void GetUINT64([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, out long punValue);

   new void GetDouble([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, out double pfValue);

   new void GetGUID([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, out Guid pguidValue);

   new void GetStringLength([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, out int pcchLength);

   new void GetString([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, [Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pwszValue, int cchBufSize, out int pcchLength);

   new void GetAllocatedString([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, [MarshalAs(UnmanagedType.LPWStr)] out string ppwszValue, out int pcchLength);

   new void GetBlobSize([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, out int pcbBlobSize);

   new void GetBlob([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, [Out, MarshalAs(UnmanagedType.LPArray)] byte[] pBuf, int cbBufSize, out int pcbBlobSize);

   // Use GetBlob instead of this     

   new void GetAllocatedBlob([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, out IntPtr ip, out int pcbSize);

   new void GetUnknown([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, [In, MarshalAs(UnmanagedType.LPStruct)] Guid riid, [MarshalAs(UnmanagedType.IUnknown)] out object ppv);

   new void SetItem([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, IntPtr Value);

   new void DeleteItem([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey);

   new void DeleteAllItems();

   new void SetUINT32([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, int unValue);

   new void SetUINT64([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, long unValue);

   new void SetDouble([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, double fValue);

   new void SetGUID([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, [In, MarshalAs(UnmanagedType.LPStruct)] Guid guidValue);

   new void SetString([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, [In, MarshalAs(UnmanagedType.LPWStr)] string wszValue);

   new void SetBlob([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, [In, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2)] byte[] pBuf, int cbBufSize);

   new void SetUnknown([MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, [In, MarshalAs(UnmanagedType.IUnknown)] object pUnknown);

   new void LockStore();

   new void UnlockStore();

   new void GetCount(out int pcItems);

   new void GetItemByIndex(int unIndex, out Guid pguidKey, IntPtr pValue);

   new void CopyAllItems([In, MarshalAs(UnmanagedType.Interface)] IMFAttributes pDest);

   #endregion

   void GetStreamDescriptorCount(out int pdwDescriptorCount);

   void GetStreamDescriptorByIndex([In] int dwIndex, [MarshalAs(UnmanagedType.Bool)] out bool pfSelected, [MarshalAs(UnmanagedType.Interface)] out IMFStreamDescriptor ppDescriptor);

   void SelectStream([In] int dwDescriptorIndex);

   void DeselectStream([In] int dwDescriptorIndex);

   void Clone([MarshalAs(UnmanagedType.Interface)] out IMFPresentationDescriptor ppPresentationDescriptor);     

}

[ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("56C03D9C-9DBB-45F5-AB4B-D80F47C05938")]     

public interface IMFStreamDescriptor : IMFAttributes {      

   #region IMFAttributes methods

   new void GetItem([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, IntPtr pValue);

   new void GetItemType([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, out MF_ATTRIBUTE_TYPE pType);

   new void CompareItem([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, IntPtr Value, [MarshalAs(UnmanagedType.Bool)] out bool pbResult);

   new void Compare([MarshalAs(UnmanagedType.Interface)] IMFAttributes pTheirs, MF_ATTRIBUTES_MATCH_TYPE MatchType, [MarshalAs(UnmanagedType.Bool)] out bool pbResult);

   new void GetUINT32([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, out int punValue);

   new void GetUINT64([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, out long punValue);

   new void GetDouble([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, out double pfValue);

   new void GetGUID([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, out Guid pguidValue);

   new void GetStringLength([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, out int pcchLength);

   new void GetString([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, [Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pwszValue, int cchBufSize, out int pcchLength);

   new void GetAllocatedString([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, [MarshalAs(UnmanagedType.LPWStr)] out string ppwszValue, out int pcchLength);

   new void GetBlobSize([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, out int pcbBlobSize);

   new void GetBlob([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, [Out, MarshalAs(UnmanagedType.LPArray)] byte[] pBuf, int cbBufSize, out int pcbBlobSize);

   // Use GetBlob instead of this     

   new void GetAllocatedBlob([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, out IntPtr ip, out int pcbSize);

   new void GetUnknown([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, [In, MarshalAs(UnmanagedType.LPStruct)] Guid riid, [MarshalAs(UnmanagedType.IUnknown)] out object ppv);

   new void SetItem([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, IntPtr Value);

   new void DeleteItem([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey);

   new void DeleteAllItems();

   new void SetUINT32([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, int unValue);

   new void SetUINT64([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, long unValue);

   new void SetDouble([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, double fValue);

   new void SetGUID([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, [In, MarshalAs(UnmanagedType.LPStruct)] Guid guidValue);

   new void SetString([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, [In, MarshalAs(UnmanagedType.LPWStr)] string wszValue);

   new void SetBlob([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, [In, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2)] byte[] pBuf, int cbBufSize);

   new void SetUnknown([MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, [In, MarshalAs(UnmanagedType.IUnknown)] object pUnknown);

   new void LockStore();

   new void UnlockStore();

   new void GetCount(out int pcItems);

   new void GetItemByIndex(int unIndex, out Guid pguidKey, IntPtr pValue);

   new void CopyAllItems([In, MarshalAs(UnmanagedType.Interface)] IMFAttributes pDest);

   #endregion

   void GetStreamIdentifier(out int pdwStreamIdentifier);

   void GetMediaTypeHandler([MarshalAs(UnmanagedType.Interface)] out IMFMediaTypeHandler ppMediaTypeHandler);     

}

[ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("44AE0FA8-EA31-4109-8D2E-4CAE4997C555")]     

public interface IMFMediaType : IMFAttributes {

   #region IMFAttributes methods

   new void GetItem([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, IntPtr pValue);

   new void GetItemType([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, out MF_ATTRIBUTE_TYPE pType);

   new void CompareItem([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, IntPtr Value, [MarshalAs(UnmanagedType.Bool)] out bool pbResult);

   new void Compare([MarshalAs(UnmanagedType.Interface)] IMFAttributes pTheirs, MF_ATTRIBUTES_MATCH_TYPE MatchType, [MarshalAs(UnmanagedType.Bool)] out bool pbResult);

   new void GetUINT32([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, out int punValue);

   new void GetUINT64([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, out long punValue);

   new void GetDouble([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, out double pfValue);

   new void GetGUID([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, out Guid pguidValue);

   new void GetStringLength([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, out int pcchLength);

   new void GetString([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, [Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pwszValue, int cchBufSize, out int pcchLength);

   new void GetAllocatedString([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, [MarshalAs(UnmanagedType.LPWStr)] out string ppwszValue, out int pcchLength);

   new void GetBlobSize([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, out int pcbBlobSize);

   new void GetBlob([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, [Out, MarshalAs(UnmanagedType.LPArray)] byte[] pBuf, int cbBufSize, out int pcbBlobSize);

   // Use GetBlob instead of this     

   new void GetAllocatedBlob([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, out IntPtr ip, out int pcbSize);

   new void GetUnknown([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, [In, MarshalAs(UnmanagedType.LPStruct)] Guid riid, [MarshalAs(UnmanagedType.IUnknown)] out object ppv);

   new void SetItem([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, IntPtr Value);

   new void DeleteItem([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey);

   new void DeleteAllItems();

   new void SetUINT32([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, int unValue);

   new void SetUINT64([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, long unValue);

   new void SetDouble([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, double fValue);

   new void SetGUID([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, [In, MarshalAs(UnmanagedType.LPStruct)] Guid guidValue);

   new void SetString([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, [In, MarshalAs(UnmanagedType.LPWStr)] string wszValue);

   new void SetBlob([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, [In, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2)] byte[] pBuf, int cbBufSize);

   new void SetUnknown([MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, [In, MarshalAs(UnmanagedType.IUnknown)] object pUnknown);

   new void LockStore();

   new void UnlockStore();

   new void GetCount(out int pcItems);

   new void GetItemByIndex(int unIndex, out Guid pguidKey, IntPtr pValue);

   new void CopyAllItems([In, MarshalAs(UnmanagedType.Interface)] IMFAttributes pDest);

   #endregion

   void GetMajorType(out Guid pguidMajorType);

   void IsCompressedFormat([MarshalAs(UnmanagedType.Bool)] out bool pfCompressed);

   [PreserveSig]     

   int IsEqual([In, MarshalAs(UnmanagedType.Interface)] IMFMediaType pIMediaType, out MF_MEDIATYPE_EQUAL pdwFlags);

   void GetRepresentation([In, MarshalAs(UnmanagedType.Struct)] Guid guidRepresentation, out IntPtr ppvRepresentation);

   void FreeRepresentation([In, MarshalAs(UnmanagedType.Struct)] Guid guidRepresentation, [In] IntPtr pvRepresentation);     

}

[ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("2CD2D921-C447-44A7-A13C-4ADABFC247E3")]     

public interface IMFAttributes {      

   void GetItem([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, IntPtr pValue);

   void GetItemType([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, out MF_ATTRIBUTE_TYPE pType);

   void CompareItem([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, IntPtr Value, [MarshalAs(UnmanagedType.Bool)] out bool pbResult);

   void Compare([MarshalAs(UnmanagedType.Interface)] IMFAttributes pTheirs, MF_ATTRIBUTES_MATCH_TYPE MatchType, [MarshalAs(UnmanagedType.Bool)] out bool pbResult);

   void GetUINT32([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, out int punValue);

   void GetUINT64([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, out long punValue);

   void GetDouble([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, out double pfValue);

   void GetGUID([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, out Guid pguidValue);

   void GetStringLength([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, out int pcchLength);

   void GetString([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, [Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pwszValue, int cchBufSize, out int pcchLength);

   void GetAllocatedString([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, [MarshalAs(UnmanagedType.LPWStr)] out string ppwszValue, out int pcchLength);

   void GetBlobSize([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, out int pcbBlobSize);

   void GetBlob([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, [Out, MarshalAs(UnmanagedType.LPArray)] byte[] pBuf, int cbBufSize, out int pcbBlobSize);

   void GetAllocatedBlob([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, out IntPtr ip, out int pcbSize);

   void GetUnknown([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, [In, MarshalAs(UnmanagedType.LPStruct)] Guid riid, [MarshalAs(UnmanagedType.IUnknown)] out object ppv);

   void SetItem([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, IntPtr Value);

   void DeleteItem([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey);

   void DeleteAllItems();

   void SetUINT32([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, int unValue);

   void SetUINT64([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, long unValue);

   void SetDouble([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, double fValue);

   void SetGUID([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, [In, MarshalAs(UnmanagedType.LPStruct)] Guid guidValue);

   void SetString([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, [In, MarshalAs(UnmanagedType.LPWStr)] string wszValue);

   void SetBlob([In, MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, [In, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2)] byte[] pBuf, int cbBufSize);

   void SetUnknown([MarshalAs(UnmanagedType.LPStruct)] Guid guidKey, [In, MarshalAs(UnmanagedType.IUnknown)] object pUnknown);

   void LockStore();

   void UnlockStore();

   void GetCount(out int pcItems);

   void GetItemByIndex(int unIndex, out Guid pguidKey, IntPtr pValue);

   void CopyAllItems([In, MarshalAs(UnmanagedType.Interface)] IMFAttributes pDest);     

}

[ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("2CD0BD52-BCD5-4B89-B62C-EADC0C031E7D")]     

public interface IMFMediaEventGenerator {      

   void GetEvent([In] IMFMediaEvent dwFlags, [MarshalAs(UnmanagedType.Interface)] out IMFMediaEvent ppEvent);

   void BeginGetEvent([In, MarshalAs(UnmanagedType.Interface)] IMFAsyncCallback pCallback, [In, MarshalAs(UnmanagedType.IUnknown)] object o);

   void EndGetEvent(IMFAsyncResult pResult, out IMFMediaEvent ppEvent);

   void QueueEvent([In] MediaEventType met, [In, MarshalAs(UnmanagedType.LPStruct)] Guid guidExtendedType, [In] int hrStatus, [In] ref object pvValue);     

}

[ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("E93DCF6C-4B07-4E1E-8123-AA16ED6EADF5")]     

public interface IMFMediaTypeHandler {      

   void IsMediaTypeSupported([In, MarshalAs(UnmanagedType.Interface)] IMFMediaType pMediaType, IntPtr ppMediaType);

   void GetMediaTypeCount(out int pdwTypeCount);

   void GetMediaTypeByIndex([In] int dwIndex, [MarshalAs(UnmanagedType.Interface)] out IMFMediaType ppType);

   void SetCurrentMediaType([In, MarshalAs(UnmanagedType.Interface)] IMFMediaType pMediaType);

   void GetCurrentMediaType([MarshalAs(UnmanagedType.Interface)] out IMFMediaType ppMediaType);

   void GetMajorType(out Guid pguidMajorType);     

}

[ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("279A808D-AEC7-40C8-9C6B-A6B492C78A66")]      

public interface IMFMediaSource : IMFMediaEventGenerator {      

   #region IMFMediaEventGenerator methods

   #pragma warning disable 109     

   new void GetEvent([In] MF_EVENT_FLAG dwFlags, [MarshalAs(UnmanagedType.Interface)] out IMFMediaEvent ppEvent);      

   #pragma warning restore 109

   new void BeginGetEvent([In, MarshalAs(UnmanagedType.Interface)] IMFAsyncCallback pCallback, [In, MarshalAs(UnmanagedType.IUnknown)] object o);

   new void EndGetEvent(IMFAsyncResult pResult, out IMFMediaEvent ppEvent);

   new void QueueEvent([In] MediaEventType met, [In, MarshalAs(UnmanagedType.LPStruct)] Guid guidExtendedType, [In] int hrStatus, [In] ref object pvValue);

   #endregion

   void GetCharacteristics(out MFMEDIASOURCE_CHARACTERISTICS pdwCharacteristics);

   void CreatePresentationDescriptor(out IMFPresentationDescriptor ppPresentationDescriptor);

   void Start([In, MarshalAs(UnmanagedType.Interface)] IMFPresentationDescriptor pPresentationDescriptor, [In, MarshalAs(UnmanagedType.LPStruct)] Guid pguidTimeFormat, [In] ref object pvarStartPosition);

   void Stop();

   void Pause();

   void Shutdown();     

}

#endregion

再加上一些数据对象
#region WM

      #region STRUCTS     

      #pragma warning restore 618

      [StructLayout(LayoutKind.Sequential, Pack = 8)]     

      public class MFVIDEOFORMAT {      

         public int dwSize;      

         public MFVideoInfo videoInfo;      

         public Guid guidFormat;      

         public MFVideoCompressedInfo compressedInfo;      

         public MFVideoSurfaceInfo surfaceInfo;      

      }

      [StructLayout(LayoutKind.Sequential, Pack = 4)]     

      public struct MFVideoSurfaceInfo {      

         public int Format;      

         public int PaletteEntries;      

         public MFPaletteEntry[] Palette;      

      }

      [StructLayout(LayoutKind.Explicit, Pack = 1)]     

      public struct MFPaletteEntry {      

         [FieldOffset(0)]      

         public MFARGB ARGB;      

         [FieldOffset(0)]      

         public MFAYUVSample AYCbCr;      

      }

      [StructLayout(LayoutKind.Sequential, Pack = 1)]     

      public struct MFAYUVSample {      

         public byte bCrValue;      

         public byte bCbValue;      

         public byte bYValue;      

         public byte bSampleAlpha8;      

      }

      [StructLayout(LayoutKind.Sequential, Pack = 1)]     

      public struct MFARGB {      

         public byte rgbBlue;      

         public byte rgbGreen;      

         public byte rgbRed;      

         public byte rgbAlpha;      

      }

      [StructLayout(LayoutKind.Sequential, Pack = 8)]     

      public struct MFVideoCompressedInfo {      

         public long AvgBitrate;      

         public long AvgBitErrorRate;      

         public int MaxKeyFrameSpacing;      

      }

      [StructLayout(LayoutKind.Sequential, Pack = 8)]     

      public struct MFVideoInfo {      

         public int dwWidth;      

         public int dwHeight;      

         public MFRatio PixelAspectRatio;      

         public MFVideoChromaSubsampling SourceChromaSubsampling;      

         public MFVideoInterlaceMode InterlaceMode;      

         public MFVideoTransferFunction TransferFunction;      

         public MFVideoPrimaries ColorPrimaries;      

         public MFVideoTransferMatrix TransferMatrix;      

         public MFVideoLighting SourceLighting;      

         public MFRatio FramesPerSecond;      

         public MFNominalRange NominalRange;      

         public MFVideoArea GeometricAperture;      

         public MFVideoArea MinimumDisplayAperture;      

         public MFVideoArea PanScanAperture;      

         public MFVideoFlags VideoFlags;      

      }

      [StructLayout(LayoutKind.Sequential, Pack = 4)]     

      public struct MFRatio {      

         public int Numerator;      

         public int Denominator;

         public MFRatio(int n, int d) {     

            Numerator = n;      

            Denominator = d;      

         }      

      }

      [StructLayout(LayoutKind.Sequential, Pack = 4)]     

      public class MFVideoArea {      

         public MFOffset OffsetX;      

         public MFOffset OffsetY;      

         public SIZE Area;

         public MFVideoArea() {     

            OffsetX = new MFOffset();      

            OffsetY = new MFOffset();      

         }

         public MFVideoArea(float x, float y, int width, int height) {     

            OffsetX = new MFOffset(x);      

            OffsetY = new MFOffset(y);      

            Area = new SIZE(width, height);      

         }

         public void MakeArea(float x, float y, int width, int height) {     

            OffsetX.MakeOffset(x);      

            OffsetY.MakeOffset(y);      

            Area.cx = width;      

            Area.cy = height;      

         }      

      }

      [StructLayout(LayoutKind.Sequential, Pack = 2)]     

      public class MFOffset {      

         public short fract;      

         public short Value;

         public MFOffset() {     

         }

         public MFOffset(float v) {     

            Value = (short)v;      

            fract = (short)(65536 * (v ?Value));      

         }

         public void MakeOffset(float v) {     

            Value = (short)v;      

            fract = (short)(65536 * (v ?Value));      

         }

         public float GetOffset() {     

            return ((float)Value) + (((float)fract) / 65536.0f);      

         }      

      }      

      #endregion

      #region ENUMS     

      public enum MFVideoInterlaceMode {      

         FieldInterleavedLowerFirst = 4,      

         FieldInterleavedUpperFirst = 3,      

         FieldSingleLower = 6,      

         FieldSingleUpper = 5,      

         ForceDWORD = 0x7fffffff,      

         Last = 8,      

         MixedInterlaceOrProgressive = 7,      

         Progressive = 2,      

         Unknown = 0      

      }

      public enum MFVideoChromaSubsampling {     

         Cosited = 7,      

         DV_PAL = 6,      

         ForceDWORD = 0x7fffffff,      

         Horizontally_Cosited = 4,      

         Last = 8,      

         MPEG1 = 1,      

         MPEG2 = 5,      

         ProgressiveChroma = 8,      

         Unknown = 0,      

         Vertically_AlignedChromaPlanes = 1,      

         Vertically_Cosited = 2      

      }

      public enum MFVideoTransferFunction {     

         Func10 = 1,      

         Func18 = 2,      

         Func20 = 3,      

         Func22 = 4,      

         Func240M = 6,      

         Func28 = 8,      

         Func709 = 5,      

         ForceDWORD = 0x7fffffff,      

         Last = 9,      

         sRGB = 7,      

         Unknown = 0      

      }

      public enum MFVideoPrimaries {     

         BT470_2_SysBG = 4,      

         BT470_2_SysM = 3,      

         BT709 = 2,      

         EBU3213 = 7,      

         ForceDWORD = 0x7fffffff,      

         Last = 9,      

         reserved = 1,      

         SMPTE_C = 8,      

         SMPTE170M = 5,      

         SMPTE240M = 6,      

         Unknown = 0      

      }

      public enum MFVideoTransferMatrix {     

         BT601 = 2,      

         BT709 = 1,      

         ForceDWORD = 0x7fffffff,      

         Last = 4,      

         SMPTE240M = 3,      

         Unknown = 0      

      }

      public enum MFVideoLighting {     

         Bright = 1,      

         Dark = 4,      

         Dim = 3,      

         ForceDWORD = 0x7fffffff,      

         Last = 5,      

         Office = 2,      

         Unknown = 0      

      }

      public enum MFNominalRange {     

         MFNominalRange_0_255 = 1,      

         MFNominalRange_16_235 = 2,      

         MFNominalRange_48_208 = 3,      

         MFNominalRange_ForceDWORD = 0x7fffffff,      

         MFNominalRange_Last = 4,      

         MFNominalRange_Normal = 1,      

         MFNominalRange_Unknown = 0,      

         MFNominalRange_Wide = 2      

      }

      [Flags]     

      public enum MFVideoFlags : long {      

         PAD_TO_Mask = 00001 | 00002,      

         PAD_TO_None = 0 * 00001,      

         PAD_TO_4x3 = 1 * 00001,      

         PAD_TO_16x9 = 2 * 00001,      

         SrcContentHintMask = 00004 | 00008 | 00010,      

         SrcContentHintNone = 0 * 00004,      

         SrcContentHint16x9 = 1 * 00004,      

         SrcContentHint235_1 = 2 * 00004,      

         AnalogProtected = 00020,      

         DigitallyProtected = 00040,      

         ProgressiveContent = 00080,      

         FieldRepeatCountMask = 00100 | 00200 | 00400,      

         FieldRepeatCountShift = 8,      

         ProgressiveSeqReset = 00800,      

         PanScanEnabled = 020000,      

         LowerFieldFirst = 040000,      

         BottomUpLinearRep = 080000,      

         DXVASurface = 0100000,      

         RenderTargetSurface = 0400000,      

         ForceQWORD = 0x7FFFFFFF      

      }

      [Flags]     

      public enum MF_EVENT_FLAG {      

         None = 0,      

         NoWait = 000000001      

      }

      public enum MFASYNC_CALLBACK_QUEUE {     

         Undefined = 000000000,      

         Standard = 000000001,      

         RT = 000000002,      

         IO = 000000003,      

         Timer = 000000004,      

         LongFunction = 000000007,      

         PrivateMask = unchecked((int)0xFFFF0000),      

         All = unchecked((int)0xFFFFFFFF)      

      }

      [Flags]     

      public enum MFASYNC {      

         None = 0,      

         FastIOProcessingCallback = 000000001,      

         SignalCallback = 000000002      

      }

      public enum MFSTARTUP {     

         NoSocket = 01,      

         Lite = 01,      

         Full = 0      

      }

      [Flags]     

      public enum MFResolution {      

         None = 00,      

         MediaSource = 000000001,      

         ByteStream = 000000002,      

         ContentDoesNotHaveToMatchExtensionOrMimeType = 000000010,      

         KeepByteStreamAliveOnFail = 000000020,      

         Read = 000010000,      

         Write = 000020000      

      }

      [Flags]     

      public enum MFBYTESTREAM {      

         None = 000000000,      

         IsReadable = 000000001,      

         IsWritable = 000000002,      

         IsSeekable = 000000004,      

         IsRemote = 000000008,      

         IsDirectory = 000000080,      

         HasSlowSeek = 000000100,      

         IsPartiallyDownloaded = 000000200      

      }

      public enum MFBYTESTREAM_SEEK_ORIGIN {     

         Begin,      

         Current      

      }

      [Flags]     

      public enum MFBYTESTREAM_SEEK_FLAG {      

         None = 0,      

         CancelPendingIO = 1      

      }

      public enum MF_OBJECT_TYPE {     

         MediaSource,      

         ByteStream,      

         Invalid      

      }

      public enum MediaEventType {     

         MEUnknown = 0,      

         MEError = (MEUnknown + 1),      

         MEExtendedType = (MEError + 1),      

         MESessionUnknown = 100,      

         MESessionTopologySet = (MESessionUnknown + 1),      

         MESessionTopologiesCleared = (MESessionTopologySet + 1),      

         MESessionStarted = (MESessionTopologiesCleared + 1),      

         MESessionPaused = (MESessionStarted + 1),      

         MESessionStopped = (MESessionPaused + 1),      

         MESessionClosed = (MESessionStopped + 1),      

         MESessionEnded = (MESessionClosed + 1),      

         MESessionRateChanged = (MESessionEnded + 1),      

         MESessionScrubSampleComplete = (MESessionRateChanged + 1),      

         MESessionCapabilitiesChanged = (MESessionScrubSampleComplete + 1),      

         MESessionTopologyStatus = (MESessionCapabilitiesChanged + 1),      

         MESessionNotifyPresentationTime = (MESessionTopologyStatus + 1),      

         MENewPresentation = (MESessionNotifyPresentationTime + 1),      

         MELicenseAcquisitionStart = (MENewPresentation + 1),      

         MELicenseAcquisitionCompleted = (MELicenseAcquisitionStart + 1),      

         MEIndividualizationStart = (MELicenseAcquisitionCompleted + 1),      

         MEIndividualizationCompleted = (MEIndividualizationStart + 1),      

         MEEnablerProgress = (MEIndividualizationCompleted + 1),      

         MEEnablerCompleted = (MEEnablerProgress + 1),      

         MEPolicyError = (MEEnablerCompleted + 1),      

         MEPolicyReport = (MEPolicyError + 1),      

         MEBufferingStarted = (MEPolicyReport + 1),      

         MEBufferingStopped = (MEBufferingStarted + 1),      

         MEConnectStart = (MEBufferingStopped + 1),      

         MEConnectEnd = (MEConnectStart + 1),      

         MEReconnectStart = (MEConnectEnd + 1),      

         MEReconnectEnd = (MEReconnectStart + 1),      

         MERendererEvent = (MEReconnectEnd + 1),      

         MESessionStreamSinkFormatChanged = (MERendererEvent + 1),      

         MESourceUnknown = 200,      

         MESourceStarted = (MESourceUnknown + 1),      

         MEStreamStarted = (MESourceStarted + 1),      

         MESourceSeeked = (MEStreamStarted + 1),      

         MEStreamSeeked = (MESourceSeeked + 1),      

         MENewStream = (MEStreamSeeked + 1),      

         MEUpdatedStream = (MENewStream + 1),      

         MESourceStopped = (MEUpdatedStream + 1),      

         MEStreamStopped = (MESourceStopped + 1),      

         MESourcePaused = (MEStreamStopped + 1),      

         MEStreamPaused = (MESourcePaused + 1),      

         MEEndOfPresentation = (MEStreamPaused + 1),      

         MEEndOfStream = (MEEndOfPresentation + 1),      

         MEMediaSample = (MEEndOfStream + 1),      

         MEStreamTick = (MEMediaSample + 1),      

         MEStreamThinMode = (MEStreamTick + 1),      

         MEStreamFormatChanged = (MEStreamThinMode + 1),      

         MESourceRateChanged = (MEStreamFormatChanged + 1),      

         MEEndOfPresentationSegment = (MESourceRateChanged + 1),      

         MESourceCharacteristicsChanged = (MEEndOfPresentationSegment + 1),      

         MESourceRateChangeRequested = (MESourceCharacteristicsChanged + 1),      

         MESourceMetadataChanged = (MESourceRateChangeRequested + 1),      

         MESequencerSourceTopologyUpdated = (MESourceMetadataChanged + 1),      

         MESinkUnknown = 300,      

         MEStreamSinkStarted = (MESinkUnknown + 1),      

         MEStreamSinkStopped = (MEStreamSinkStarted + 1),      

         MEStreamSinkPaused = (MEStreamSinkStopped + 1),      

         MEStreamSinkRateChanged = (MEStreamSinkPaused + 1),      

         MEStreamSinkRequestSample = (MEStreamSinkRateChanged + 1),      

         MEStreamSinkMarker = (MEStreamSinkRequestSample + 1),      

         MEStreamSinkPrerolled = (MEStreamSinkMarker + 1),      

         MEStreamSinkScrubSampleComplete = (MEStreamSinkPrerolled + 1),      

         MEStreamSinkFormatChanged = (MEStreamSinkScrubSampleComplete + 1),      

         MEStreamSinkDeviceChanged = (MEStreamSinkFormatChanged + 1),      

         MEQualityNotify = (MEStreamSinkDeviceChanged + 1),      

         MESinkInvalidated = (MEQualityNotify + 1),      

         MEAudioSessionNameChanged = (MESinkInvalidated + 1),      

         MEAudioSessionVolumeChanged = (MEAudioSessionNameChanged + 1),      

         MEAudioSessionDeviceRemoved = (MEAudioSessionVolumeChanged + 1),      

         MEAudioSessionServerShutdown = (MEAudioSessionDeviceRemoved + 1),      

         MEAudioSessionGroupingParamChanged = (MEAudioSessionServerShutdown + 1),      

         MEAudioSessionIconChanged = (MEAudioSessionGroupingParamChanged + 1),      

         MEAudioSessionFormatChanged = (MEAudioSessionIconChanged + 1),      

         MEAudioSessionDisconnected = (MEAudioSessionFormatChanged + 1),      

         MEAudioSessionExclusiveModeOverride = (MEAudioSessionDisconnected + 1),      

         METrustUnknown = 400,      

         MEPolicyChanged = (METrustUnknown + 1),      

         MEContentProtectionMessage = (MEPolicyChanged + 1),      

         MEPolicySet = (MEContentProtectionMessage + 1),      

         MEWMDRMLicenseBackupCompleted = 500,      

         MEWMDRMLicenseBackupProgress = 501,      

         MEWMDRMLicenseRestoreCompleted = 502,      

         MEWMDRMLicenseRestoreProgress = 503,      

         MEWMDRMLicenseAcquisitionCompleted = 506,      

         MEWMDRMIndividualizationCompleted = 508,      

         MEWMDRMIndividualizationProgress = 513,      

         MEWMDRMProximityCompleted = 514,      

         MEWMDRMLicenseStoreCleaned = 515,      

         MEWMDRMRevocationDownloadCompleted = 516,      

         MEReservedMax = 10000      

      }

      public enum MF_ATTRIBUTE_TYPE {     

         None = 00,      

         Blob = 01011,      

         Double = 05,      

         Guid = 048,      

         IUnknown = 13,      

         String = 0x1f,      

         Uint32 = 013,      

         Uint64 = 015      

      }

      public enum MF_ATTRIBUTES_MATCH_TYPE {     

         OurItems,      

         TheirItems,      

         AllItems,      

         InterSection,      

         Smaller      

      }

      [Flags]     

      public enum MFMEDIASOURCE_CHARACTERISTICS {      

         None = 0,      

         IsLive = 01,      

         CanSeek = 02,      

         CanPause = 04,      

         HasSlowSeek = 08      

      }

      [Flags]     

      public enum MF_MEDIATYPE_EQUAL {      

         None = 0,      

         MajorTypes = 000000001,      

         FormatTypes = 000000002,      

         FormatData = 000000004,      

         FormatUserData = 000000008      

      }      

      #endregion

      #endregion

有些繁琐,权利?这是!但是这些接口可扩展性。这里例如一些附加值等方法如何阅读媒体元数据,利用媒体基金会
现在,当我们做了大部分工作,元数据是小菜一碟。所有我们需要的是获得服务句柄{C16的}
和获取信息的属性包{C17的}
在这里,这个对象如何在托管代码中看起来{C18的}
和一些额外的类和GUID履行解决方案。{C19的}
我们几乎完成了。唯一的一点是,不要忘记释放所有的COM对象(Marshal.ReleaseComObject(),以防止内存泄漏和init和shutdown媒体基金会??:{C20的}
您可以选​​择使用什么:简单,但不支持或复杂,但可扩展的方法。两者都将带来相同的结果。因此,有一个愉快的一天,是善良的人。 相关文章:
{A2的}

回答

评论会员:b 时间:2
呜呜呜坏
:!Greg_moon。:我如何能得到音频流过。连同视频