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

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160
