c#中用DirectShow实现媒体播放器的核心(0) 完成后的代码

c#可以开发多媒体软件吗?当然能。复杂吗?当然不复杂。资源占用严重吗?当然不严重。和普通cpp + com开发有什么不同吗?没什么不同。一定要用DirectShow开发的吗?随你高兴爱用不用。为什么不选cpp而是选c#进行媒体开发呢?为什么(why)的问题请去询问哲学家,我只回答你怎么样(how)的问题。能稍微解释下代码的意思吗?没看到标题index==0嘛,当然要做做前戏啦,哪有第0节就开始正题的,东方人是很矜持滴。
 

 

  1using System;
  2using System.Collections.Generic;
  3using System.Text;
  4using System.Diagnostics;
  5using DirectShowLib;
  6
  7namespace SoundPlayer
  8{
  9    public class SoundPlayer
 10    {
 11        IFilterGraph2 graphBuilder;
 12        IMediaSeeking mediaSeeking;
 13        IMediaControl mediaControl;
 14        IBasicAudio audioControl;
 15        IVideoWindow window;
 16        Stack<int> errorStack = new Stack<int>();
 17        bool isValidate = false;
 18        public bool Validate
 19        {
 20            get return isValidate; }
 21        }

 22
 23        string fileName = string.Empty;
 24        public SoundPlayer( string file)
 25        {
 26            graphBuilder = (new FilterGraph()) as IFilterGraph2;
 27            if (graphBuilder == nullreturn;
 28            mediaControl = graphBuilder as IMediaControl;
 29            mediaSeeking = graphBuilder as IMediaSeeking;
 30            audioControl = graphBuilder as IBasicAudio;
 31            if (mediaControl == null || mediaSeeking == null || audioControl == nullreturn;
 32            int hr = mediaControl.RenderFile(file);
 33            fileName = file;
 34            if (hr != 0) errorStack.Push(hr);
 35            if (hr != 0return;
 36            mediaSeeking.SetTimeFormat(TimeFormat.MediaTime);
 37            window  = graphBuilder as IVideoWindow;
 38            
 39            isValidate = true;
 40        }

 41        public bool Play()
 42        {
 43            Debug.Assert(isValidate);
 44            int hr = mediaControl.Run();
 45            if (hr != 0) errorStack.Push(hr);
 46            return (hr == 0);
 47        }

 48        public bool Stop()
 49        {
 50            Debug.Assert(isValidate);
 51            int hr = mediaControl.Stop();
 52            this.CurrentPosition = 0;
 53            if (hr != 0) errorStack.Push(hr);
 54            window.put_Visible(OABool.False);
 55            return (hr == 0);
 56        }

 57        public bool Pause()
 58        {
 59            Debug.Assert(isValidate);
 60            int hr = mediaControl.Pause();
 61            if (hr != 0) errorStack.Push(hr);
 62            return (hr == 0);
 63        }

 64
 65        public long CurrentPosition
 66        {
 67            get
 68            {
 69                Debug.Assert(isValidate);
 70                long cur = -1;
 71                int hr = mediaSeeking.GetCurrentPosition(out cur);
 72                if (hr != 0) errorStack.Push(hr);
 73                return cur / (10000);
 74            }

 75            set
 76            {
 77                Debug.Assert(isValidate);
 78                long stopPosition = -1;
 79                int hr = mediaSeeking.GetStopPosition(out stopPosition);
 80                if (hr != 0) errorStack.Push(hr);
 81                hr = mediaSeeking.SetPositions(value * 10000, AMSeekingSeekingFlags.AbsolutePositioning,
 82                    stopPosition, AMSeekingSeekingFlags.AbsolutePositioning);
 83                if (hr != 0) errorStack.Push(hr);
 84            }

 85        }

 86
 87        public void SetOwner(IntPtr ptr)
 88        {
 89            if (window != null)
 90            {
 91                window.put_Owner(ptr);
 92
 93            }

 94        }

 95
 96        public string CurrentFile
 97        {
 98            get
 99            {
100                return fileName;
101            }

102        }

103
104        public long Duration
105        {
106            get
107            {
108                Debug.Assert(isValidate);
109                long dur = -1;
110                int hr = mediaSeeking.GetDuration(out dur);
111                if (hr != 0) errorStack.Push(hr);
112                return dur / 10000;
113            }

114        }

115
116        public double Rate
117        {
118            get
119            {
120                Debug.Assert(isValidate);
121                double rate = 0.0;
122                int hr = mediaSeeking.GetRate(out rate);
123                if (hr != 0) errorStack.Push(hr);
124                return rate;
125            }

126            set
127            {
128                Debug.Assert(isValidate);
129                int hr = mediaSeeking.SetRate(value);
130                if (hr != 0) errorStack.Push(hr);
131            }

132        }

133
134        public int Volume
135        {
136            get
137            {
138                Debug.Assert(isValidate);
139                int volume = 0;
140                int hr = audioControl.get_Volume(out volume);
141                if (hr != 0) errorStack.Push(hr);
142                return volume;
143            }

144            set
145            {
146                Debug.Assert(isValidate);
147                int hr = audioControl.put_Volume(value);
148                if (hr != 0) errorStack.Push(hr);
149            }

150        }

151
152        public int GetLastErrorCode()
153        {
154            if (errorStack.Count != 0return errorStack.Pop();
155            else return 0;
156        }

157
158    }

159}

160


 

posted @ 2007-05-10 19:58  gussing  阅读(7829)  评论(16编辑  收藏  举报