wince.net directshow开发
DS接口代码: using System;
using System.Runtime.InteropServices; namespace ImenuPDA
{ [ComVisible(false)] public enum PinDirection // PIN_DIRECTION { Input, // PINDIR_INPUT Output // PINDIR_OUTPUT } public enum DsEvCode
{ None, Complete = 0x01, // EC_COMPLETE UserAbort = 0x02, // EC_USERABORT ErrorAbort = 0x03, // EC_ERRORABORT Time = 0x04, // EC_TIME Repaint = 0x05, // EC_REPAINT StErrStopped = 0x06, // EC_STREAM_ERROR_STOPPED StErrStPlaying = 0x07, // EC_STREAM_ERROR_STILLPLAYING ErrorStPlaying = 0x08, // EC_ERROR_STILLPLAYING PaletteChanged = 0x09, // EC_PALETTE_CHANGED VideoSizeChanged = 0x0a, // EC_VIDEO_SIZE_CHANGED QualityChange = 0x0b, // EC_QUALITY_CHANGE ShuttingDown = 0x0c, // EC_SHUTTING_DOWN ClockChanged = 0x0d, // EC_CLOCK_CHANGED Paused = 0x0e, // EC_PAUSED OpeningFile = 0x10, // EC_OPENING_FILE BufferingData = 0x11, // EC_BUFFERING_DATA FullScreenLost = 0x12, // EC_FULLSCREEN_LOST Activate = 0x13, // EC_ACTIVATE NeedRestart = 0x14, // EC_NEED_RESTART WindowDestroyed = 0x15, // EC_WINDOW_DESTROYED DisplayChanged = 0x16, // EC_DISPLAY_CHANGED Starvation = 0x17, // EC_STARVATION OleEvent = 0x18, // EC_OLE_EVENT NotifyWindow = 0x19, // EC_NOTIFY_WINDOW // EC_ .... // DVDevCod.h
DvdDomChange = 0x101, // EC_DVD_DOMAIN_CHANGE DvdTitleChange = 0x102, // EC_DVD_TITLE_CHANGE DvdChaptStart = 0x103, // EC_DVD_CHAPTER_START DvdAudioStChange = 0x104, // EC_DVD_AUDIO_STREAM_CHANGE DvdSubPicStChange = 0x105, // EC_DVD_SUBPICTURE_STREAM_CHANGE
DvdAngleChange = 0x106, // EC_DVD_ANGLE_CHANGE DvdButtonChange = 0x107, // EC_DVD_BUTTON_CHANGE DvdValidUopsChange = 0x108, // EC_DVD_VALID_UOPS_CHANGE DvdStillOn = 0x109, // EC_DVD_STILL_ON DvdStillOff = 0x10a, // EC_DVD_STILL_OFF DvdCurrentTime = 0x10b, // EC_DVD_CURRENT_TIME DvdError = 0x10c, // EC_DVD_ERROR DvdWarning = 0x10d, // EC_DVD_WARNING DvdChaptAutoStop = 0x10e, // EC_DVD_CHAPTER_AUTOSTOP DvdNoFpPgc = 0x10f, // EC_DVD_NO_FP_PGC DvdPlaybRateChange = 0x110, // EC_DVD_PLAYBACK_RATE_CHANGE DvdParentalLChange = 0x111, // EC_DVD_PARENTAL_LEVEL_CHANGE DvdPlaybStopped = 0x112, // EC_DVD_PLAYBACK_STOPPED DvdAnglesAvail = 0x113, // EC_DVD_ANGLES_AVAILABLE DvdPeriodAStop = 0x114, // EC_DVD_PLAYPERIOD_AUTOSTOP DvdButtonAActivated = 0x115, // EC_DVD_BUTTON_AUTO_ACTIVATED DvdCmdStart = 0x116, // EC_DVD_CMD_START DvdCmdEnd = 0x117, // EC_DVD_CMD_END DvdDiscEjected = 0x118, // EC_DVD_DISC_EJECTED DvdDiscInserted = 0x119, // EC_DVD_DISC_INSERTED DvdCurrentHmsfTime = 0x11a, // EC_DVD_CURRENT_HMSF_TIME DvdKaraokeMode = 0x11b // EC_DVD_KARAOKE_MODE } [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode), ComVisible(false)]
public class FilterInfo // FILTER_INFO { [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)] public string achName; [MarshalAs(UnmanagedType.IUnknown)] public object pUnk; } [StructLayout(LayoutKind.Sequential), ComVisible(false)]
public class AMMediaType // AM_MEDIA_TYPE { public Guid majorType; public Guid subType; [MarshalAs(UnmanagedType.Bool)] public bool fixedSizeSamples; [MarshalAs(UnmanagedType.Bool)] public bool temporalCompression; public int sampleSize; public Guid formatType; public IntPtr unkPtr; public uint cbFormat; public IntPtr formatPtr; } [ComVisible(true), ComImport, Guid("56a86891-0ad4-11ce-b03a-0020af0ba770"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] public interface IPin { [PreserveSig] int Connect( [In] IPin pReceivePin, [In, MarshalAs(UnmanagedType.LPStruct)] AMMediaType pmt); [PreserveSig]
int ReceiveConnection( [In] IPin pReceivePin, [In, MarshalAs(UnmanagedType.LPStruct)] AMMediaType pmt); [PreserveSig]
int Disconnect(); [PreserveSig]
int ConnectedTo([Out] out IPin ppPin); [PreserveSig]
int ConnectionMediaType( [Out, MarshalAs(UnmanagedType.LPStruct)] AMMediaType pmt); [PreserveSig]
int QueryPinInfo(IntPtr pInfo); [PreserveSig]
int QueryDirection(out PinDirection pPinDir); [PreserveSig]
int QueryId( [Out, MarshalAs(UnmanagedType.LPWStr)] out string Id); [PreserveSig]
int QueryAccept( [In, MarshalAs(UnmanagedType.LPStruct)] AMMediaType pmt); [PreserveSig]
int EnumMediaTypes(IntPtr ppEnum); [PreserveSig]
int QueryInternalConnections(IntPtr apPin, [In, Out] ref int nPin); [PreserveSig]
int EndOfStream(); [PreserveSig]
int BeginFlush(); [PreserveSig]
int EndFlush(); [PreserveSig]
int NewSegment(long tStart, long tStop, double dRate); } [ComVisible(true), ComImport,
Guid("56a86897-0ad4-11ce-b03a-0020af0ba770"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] public interface IReferenceClock { [PreserveSig] int GetTime(out long pTime); [PreserveSig]
int AdviseTime(long baseTime, long streamTime, IntPtr hEvent, out int pdwAdviseCookie); [PreserveSig]
int AdvisePeriodic(long startTime, long periodTime, IntPtr hSemaphore, out int pdwAdviseCookie); [PreserveSig]
int Unadvise(int dwAdviseCookie); } [ComVisible(true), ComImport,
Guid("56a8689f-0ad4-11ce-b03a-0020af0ba770"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] public interface IFilterGraph { [PreserveSig] int AddFilter( [In] IBaseFilter pFilter, [In, MarshalAs(UnmanagedType.LPWStr)] string pName); [PreserveSig]
int RemoveFilter([In] IBaseFilter pFilter); [PreserveSig]
int EnumFilters([Out] out IEnumFilters ppEnum); [PreserveSig]
int FindFilterByName( [In, MarshalAs(UnmanagedType.LPWStr)] string pName, [Out] out IBaseFilter ppFilter); [PreserveSig]
int ConnectDirect([In] IPin ppinOut, [In] IPin ppinIn, [In, MarshalAs(UnmanagedType.LPStruct)] AMMediaType pmt); [PreserveSig]
int Reconnect([In] IPin ppin); [PreserveSig]
int Disconnect([In] IPin ppin); [PreserveSig]
int SetDefaultSyncSource(); }
[ComVisible(true), ComImport,
Guid("56a86892-0ad4-11ce-b03a-0020af0ba770"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] public interface IEnumPins { [PreserveSig] int Next( [In] int cPins, [Out, MarshalAs(UnmanagedType.LPArray)] out IPin[] ppPins, [Out] out int pcFetched); [PreserveSig]
int Skip([In] int cPins); void Reset(); void Clone([Out] out IEnumPins ppEnum); } [ComVisible(true), ComImport, Guid("56a86895-0ad4-11ce-b03a-0020af0ba770"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] public interface IBaseFilter { #region "IPersist Methods" [PreserveSig] int GetClassID( [Out] out Guid pClassID); #endregion #region "IMediaFilter Methods"
[PreserveSig] int Stop(); [PreserveSig]
int Pause(); [PreserveSig]
int Run(long tStart); [PreserveSig]
int GetState(int dwMilliSecsTimeout, [Out] out int filtState); [PreserveSig]
int SetSyncSource([In] IReferenceClock pClock); [PreserveSig]
int GetSyncSource([Out] out IReferenceClock pClock); #endregion [PreserveSig]
int EnumPins( [Out] out IEnumPins ppEnum); [PreserveSig]
int FindPin( [In, MarshalAs(UnmanagedType.LPWStr)] string Id, [Out] out IPin ppPin); [PreserveSig]
int QueryFilterInfo( [Out] FilterInfo pInfo); [PreserveSig]
int JoinFilterGraph( [In] IFilterGraph pGraph, [In, MarshalAs(UnmanagedType.LPWStr)] string pName); [PreserveSig]
int QueryVendorInfo( [Out, MarshalAs(UnmanagedType.LPWStr)] out string pVendorInfo); } [ComVisible(true), ComImport, Guid("56a868a9-0ad4-11ce-b03a-0020af0ba770"),//56a868a9-0ad4-11ce-b03a-0020af0ba770 InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] public interface IGraphBuilder { #region "IFilterGraph Methods" [PreserveSig] int AddFilter( [In] IBaseFilter pFilter, [In, MarshalAs(UnmanagedType.LPWStr)] string pName); [PreserveSig]
int RemoveFilter([In] IBaseFilter pFilter); [PreserveSig]
int EnumFilters([Out] out IEnumFilters ppEnum); [PreserveSig]
int FindFilterByName( [In, MarshalAs(UnmanagedType.LPWStr)] string pName, [Out] out IBaseFilter ppFilter); /// <summary>
/// This method connects the two pins directly (without intervening filters). /// </summary> /// <param name="ppinOut"></param> /// <param name="ppinIn"></param> /// <param name="pmt">[in] Media type to use for the connection (optional; that is, can be NULL). </param> /// <returns></returns> [PreserveSig] int ConnectDirect([In] IPin ppinOut, [In] IPin ppinIn, [In, MarshalAs(UnmanagedType.LPStruct)] AMMediaType pmt); [PreserveSig]
int Reconnect([In] IPin ppin); [PreserveSig]
int Disconnect([In] IPin ppin); [PreserveSig]
int SetDefaultSyncSource(); #endregion [PreserveSig]
int Connect([In] IPin ppinOut, [In] IPin ppinIn); [PreserveSig]
int Render([In] IPin ppinOut); [PreserveSig]
int RenderFile( [In, MarshalAs(UnmanagedType.LPWStr)] string lpcwstrFile, [In, MarshalAs(UnmanagedType.LPWStr)] string lpcwstrPlayList); [PreserveSig]
int AddSourceFilter( [In, MarshalAs(UnmanagedType.LPWStr)] string lpcwstrFileName, [In, MarshalAs(UnmanagedType.LPWStr)] string lpcwstrFilterName, [Out] out IBaseFilter ppFilter); [PreserveSig]
int SetLogFile(IntPtr hFile); [PreserveSig]
int Abort(); [PreserveSig]
int ShouldOperationContinue(); } // ---------------------------------------------------------------------------------------
/// <summary> /// The IFilterGraph::EnumFilters method returns the enumerator interface. It is based on the COM IEnum style of enumerators. /// </summary> [ComVisible(true), ComImport, Guid("56a86893-0ad4-11ce-b03a-0020af0ba770"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] public interface IEnumFilters { [PreserveSig] int Next( [In] int cFilters, [Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2)] out IBaseFilter[] ppFilter, [Out] out int pcFetched); [PreserveSig]
int Skip([In] int cFilters); void Reset(); void Clone([Out] out IEnumFilters ppEnum); } [ComVisible(true), ComImport,
Guid("56a868c0-0ad4-11ce-b03a-0020af0ba770"), InterfaceType(ComInterfaceType.InterfaceIsDual)] public interface IMediaEventEx { #region "IMediaEvent Methods" [PreserveSig] int GetEventHandle(out IntPtr hEvent); [PreserveSig]
int GetEvent(out DsEvCode lEventCode, out int lParam1, out int lParam2, uint msTimeout); [PreserveSig]
int WaitForCompletion(int msTimeout, [Out] out int pEvCode); [PreserveSig]
int CancelDefaultHandling(int lEvCode); [PreserveSig]
int RestoreDefaultHandling(int lEvCode); [PreserveSig]
int FreeEventParams(DsEvCode lEvCode, int lParam1, int lParam2); #endregion [PreserveSig] int SetNotifyWindow(IntPtr hwnd, int lMsg, IntPtr lInstanceData); [PreserveSig]
int SetNotifyFlags(int lNoNotifyFlags); [PreserveSig]
int GetNotifyFlags(out int lplNoNotifyFlags); } [ComVisible(true), ComImport, Guid("56a868b5-0ad4-11ce-b03a-0020af0ba770"), InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] public interface IBasicVideo { [PreserveSig] int get_AvgTimePerFrame(out double pAvgTimePerFrame); [PreserveSig]
int get_BitRate(out int pBitRate); [PreserveSig]
int get_BitErrorRate(out int pBitRate); [PreserveSig]
int get_VideoWidth(out int pVideoWidth); [PreserveSig]
int get_VideoHeight(out int pVideoHeight); [PreserveSig] int put_SourceLeft(int SourceLeft); [PreserveSig] int get_SourceLeft(out int pSourceLeft); [PreserveSig]
int put_SourceWidth(int SourceWidth); [PreserveSig] int get_SourceWidth(out int pSourceWidth); [PreserveSig]
int put_SourceTop(int SourceTop); [PreserveSig] int get_SourceTop(out int pSourceTop); [PreserveSig]
int put_SourceHeight(int SourceHeight); [PreserveSig] int get_SourceHeight(out int pSourceHeight); [PreserveSig]
int put_DestinationLeft(int DestinationLeft); [PreserveSig] int get_DestinationLeft(out int pDestinationLeft); [PreserveSig]
int put_DestinationWidth(int DestinationWidth); [PreserveSig] int get_DestinationWidth(out int pDestinationWidth); [PreserveSig]
int put_DestinationTop(int DestinationTop); [PreserveSig] int get_DestinationTop(out int pDestinationTop); [PreserveSig]
int put_DestinationHeight(int DestinationHeight); [PreserveSig] int get_DestinationHeight(out int pDestinationHeight); [PreserveSig]
int SetSourcePosition(int left, int top, int width, int height); [PreserveSig] int GetSourcePosition(out int left, out int top, out int width, out int height); [PreserveSig] int SetDefaultSourcePosition(); [PreserveSig] int SetDestinationPosition(int left, int top, int width, int height); [PreserveSig] int GetDestinationPosition(out int left, out int top, out int width, out int height); [PreserveSig] int SetDefaultDestinationPosition(); [PreserveSig] int GetVideoSize(out int pWidth, out int pHeight); [PreserveSig]
int GetVideoPaletteEntries(int StartIndex, int Entries, out int pRetrieved, IntPtr pPalette); [PreserveSig]
int GetCurrentImage(ref int pBufferSize, IntPtr pDIBImage); [PreserveSig]
int IsUsingDefaultSource(); [PreserveSig] int IsUsingDefaultDestination(); /* The following will supported in IBasicVideo2 [PreserveSig] int GetPreferredAspectRatio(out int plAspectX, out int plAspectY); */ } [ComVisible(true), ComImport,
Guid("56a868b4-0ad4-11ce-b03a-0020af0ba770"), InterfaceType(ComInterfaceType.InterfaceIsDual)] public interface IVideoWindow { [PreserveSig] int put_Caption(string caption); [PreserveSig] int get_Caption([Out] out string caption); [PreserveSig]
int put_WindowStyle(int windowStyle); [PreserveSig] int get_WindowStyle(out int windowStyle); [PreserveSig]
int put_WindowStyleEx(int windowStyleEx); [PreserveSig] int get_WindowStyleEx(out int windowStyleEx); [PreserveSig]
int put_AutoShow(int autoShow); [PreserveSig] int get_AutoShow(out int autoShow); [PreserveSig]
int put_WindowState(int windowState); [PreserveSig] int get_WindowState(out int windowState); [PreserveSig]
int put_BackgroundPalette(int backgroundPalette); [PreserveSig] int get_BackgroundPalette(out int backgroundPalette); [PreserveSig]
int put_Visible(int visible); [PreserveSig] int get_Visible(out int visible); [PreserveSig]
int put_Left(int left); [PreserveSig] int get_Left(out int left); [PreserveSig]
int put_Width(int width); [PreserveSig] int get_Width(out int width); [PreserveSig]
int put_Top(int top); [PreserveSig] int get_Top(out int top); [PreserveSig]
int put_Height(int height); [PreserveSig] int get_Height(out int height); [PreserveSig]
int put_Owner(IntPtr owner); [PreserveSig] int get_Owner(out IntPtr owner); [PreserveSig]
int put_MessageDrain(IntPtr drain); [PreserveSig] int get_MessageDrain(out IntPtr drain); [PreserveSig]
int get_BorderColor(out int color); [PreserveSig] int put_BorderColor(int color); [PreserveSig]
int get_FullScreenMode(out int fullScreenMode); [PreserveSig] int put_FullScreenMode(int fullScreenMode); [PreserveSig]
int SetWindowForeground(int focus); [PreserveSig]
int NotifyOwnerMessage(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam); [PreserveSig]
int SetWindowPosition(int left, int top, int width, int height); [PreserveSig]
int GetWindowPosition(out int left, out int top, out int width, out int height); [PreserveSig]
int GetMinIdealImageSize(out int width, out int height); [PreserveSig]
int GetMaxIdealImageSize(out int width, out int height); [PreserveSig]
int GetRestorePosition(out int left, out int top, out int width, out int height); [PreserveSig]
int HideCursor(int hideCursor); [PreserveSig]
int IsCursorHidden(out int hideCursor); } [ComVisible(true), ComImport,
Guid("56a868b3-0ad4-11ce-b03a-0020af0ba770"), InterfaceType(ComInterfaceType.InterfaceIsDual)] public interface IBasicAudio { [PreserveSig] int put_Volume(int lVolume); [PreserveSig] int get_Volume(out int plVolume); [PreserveSig]
int put_Balance(int lBalance); [PreserveSig] int get_Balance(out int plBalance); } [ComVisible(true), ComImport,
Guid("56a868b1-0ad4-11ce-b03a-0020af0ba770"), InterfaceType(ComInterfaceType.InterfaceIsDual)] public interface IMediaControl { [PreserveSig] int Run(); [PreserveSig]
int Pause(); [PreserveSig]
int Stop(); [PreserveSig]
int GetState(int msTimeout, out int pfs); [PreserveSig]
int RenderFile(string strFilename); [PreserveSig]
int AddSourceFilter( [In] string strFilename, [Out, MarshalAs(UnmanagedType.IDispatch)] out object ppUnk); [PreserveSig]
int get_FilterCollection( [Out, MarshalAs(UnmanagedType.IDispatch)] out object ppUnk); [PreserveSig]
int get_RegFilterCollection( [Out, MarshalAs(UnmanagedType.IDispatch)] out object ppUnk); [PreserveSig]
int StopWhenReady(); } }
调用示例:
using System;
using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Runtime.InteropServices; namespace ImenuPDA
{ public partial class Form2 : Form { Guid FilterGraph = new Guid("e436ebb3-524f-11ce-9f53-0020af0ba770"); object comObject = null; //要播放的文件路径 //string clipFile = @"\clock.avi"; string clipFile = @"\ResidentFlash\Diablo3-CinematicTrailer_US (1).wmv"; IGraphBuilder graphBuilder; private IVideoWindow videoWin; private IBasicVideo basicVideo; private IBasicAudio basicAudio; private IMediaControl mediaCtl; private IMediaEventEx mediaEvt; private const int WM_GRAPHNOTIFY = 0x00008001;
private const int WS_CHILD = 0x40000000; private const int WS_CLIPCHILDREN = 0x02000000; private const int WS_CLIPSIBLINGS = 0x04000000; public Form2() { InitializeComponent(); } private void menuItem1_Click(object sender, EventArgs e)
{ try { //获得DirectShow的接口 GetInterface(); //使用GraphBuilder 的智能链接来自动播放音视频文件。
int hr = graphBuilder.RenderFile(clipFile, null); //每一次调用Com方法要检查返回的int类型的数据,如果小于0,一般意味着有错误发生 //并通过放回值可以知道何种错误。 CHK(hr); hr = mediaEvt.SetNotifyWindow(this.Handle, WM_GRAPHNOTIFY, IntPtr.Zero);
CHK(hr); hr = videoWin.put_Owner(this.Handle);
CHK(hr); //设置视频播放窗口类型 hr = videoWin.put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN); CHK(hr); Rectangle rc = this.ClientRectangle; //设置视频播放窗口大小位置 hr = videoWin.SetWindowPosition(0, 0, rc.Right, rc.Bottom); CHK(hr); //通过IMediaControl接口的Run方法来使得整个Filter Graph运行从而播放文件
hr = mediaCtl.Run(); CHK(hr); } catch (Exception ex) { MessageBox.Show(ex.Message); } } private void CHK(int hr)
{ if (hr < 0) { Marshal.ThrowExceptionForHR(hr); } } private void GetInterface()
{ try { comObject = CreateComObj(FilterGraph); graphBuilder = (IGraphBuilder)comObject; comObject = null; //通过获得的IGraphBuilder接口来获得其他接口 mediaCtl = (IMediaControl)graphBuilder; mediaEvt = (IMediaEventEx)graphBuilder; videoWin = graphBuilder as IVideoWindow; basicVideo = graphBuilder as IBasicVideo; basicAudio = graphBuilder as IBasicAudio; } finally { if (comObject != null) Marshal.ReleaseComObject(comObject); comObject = null; } } private object CreateComObj(Guid ClsID)
{ object com = null; try { //通过Com对象的Guid来生成Com对象 Type clsType = Type.GetTypeFromCLSID(ClsID); com = Activator.CreateInstance(clsType); } catch (Exception ex) { MessageBox.Show(ex.Message); } return com; } private void Form2_Load(object sender, EventArgs e)
{ }
} } 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/shigang207/archive/2009/02/11/3878225.aspx
|
|