,按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的}