c#中用DirectShow实现媒体播放器的核心(0) 完成后的代码
c#可以开发多媒体软件吗?当然能。复杂吗?当然不复杂。资源占用严重吗?当然不严重。和普通cpp + com开发有什么不同吗?没什么不同。一定要用DirectShow开发的吗?随你高兴爱用不用。为什么不选cpp而是选c#进行媒体开发呢?为什么(why)的问题请去询问哲学家,我只回答你怎么样(how)的问题。能稍微解释下代码的意思吗?没看到标题index==0嘛,当然要做做前戏啦,哪有第0节就开始正题的,东方人是很矜持滴。
1
using System;
2
using System.Collections.Generic;
3
using System.Text;
4
using System.Diagnostics;
5
using DirectShowLib;
6
7
namespace 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 == null) return;
28
mediaControl = graphBuilder as IMediaControl;
29
mediaSeeking = graphBuilder as IMediaSeeking;
30
audioControl = graphBuilder as IBasicAudio;
31
if (mediaControl == null || mediaSeeking == null || audioControl == null) return;
32
int hr = mediaControl.RenderFile(file);
33
fileName = file;
34
if (hr != 0) errorStack.Push(hr);
35
if (hr != 0) return;
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 != 0) return errorStack.Pop();
155
else return 0;
156
}
157
158
}
159
}
160
using System;2
using System.Collections.Generic;3
using System.Text;4
using System.Diagnostics;5
using DirectShowLib;6

7
namespace SoundPlayer8


{9
public class SoundPlayer10

{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 Validate19

{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 == null) return;28
mediaControl = graphBuilder as IMediaControl;29
mediaSeeking = graphBuilder as IMediaSeeking;30
audioControl = graphBuilder as IBasicAudio;31
if (mediaControl == null || mediaSeeking == null || audioControl == null) return;32
int hr = mediaControl.RenderFile(file);33
fileName = file;34
if (hr != 0) errorStack.Push(hr);35
if (hr != 0) return;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 CurrentPosition66

{67
get68

{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
set76

{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 CurrentFile97

{98
get99

{100
return fileName;101
}102
}103

104
public long Duration105

{106
get107

{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 Rate117

{118
get119

{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
set127

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

134
public int Volume135

{136
get137

{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
set145

{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 != 0) return errorStack.Pop();155
else return 0;156
}157

158
}159
}160

