1
unit
Main;
2
3
interface
4
5
uses
6
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
7
DirectShow, ExtCtrls, Buttons, ActiveX;
8
9
const
10
WM_GraphNotify
=
WM_App
+
1
;
11
12
type
13
TMainForm
=
class
(TForm)
14
DisplayPanel: TPanel;
15
SpeedButton1: TSpeedButton;
16
SpeedButton2: TSpeedButton;
17
SpeedButton3: TSpeedButton;
18
SpeedButton4: TSpeedButton;
19
SpeedButton5: TSpeedButton;
20
SpeedButton6: TSpeedButton;
21
SpeedButton7: TSpeedButton;
22
Image1: TImage;
23
OpenDialog: TOpenDialog;
24
procedure
SpeedButton1Click(Sender: TObject);
25
procedure
FormCreate(Sender: TObject);
26
procedure
FormDestroy(Sender: TObject);
27
procedure
DisplayPanelResize(Sender: TObject);
28
procedure
SpeedButton2Click(Sender: TObject);
29
procedure
SpeedButton3Click(Sender: TObject);
30
procedure
SpeedButton4Click(Sender: TObject);
31
procedure
SpeedButton5Click(Sender: TObject);
32
procedure
SpeedButton6Click(Sender: TObject);
33
procedure
SpeedButton7Click(Sender: TObject);
34
private
35
{
Private declarations
}
36
protected
37
procedure
WMGraphNotify(
var
Msg: TMessage);
message
WM_GraphNotify;
38
public
39
{
Public declarations
}
40
GraphBuilder: IGraphBuilder;
41
VideoWindow: IVideoWindow;
42
MediaControl: IMediaControl;
43
MediaEvent: IMediaEventEx;
44
MediaSeek: IMediaSeeking;
45
SampleGrabber: ISampleGrabber;
46
47
procedure
GraphDestory;
48
procedure
OpenFile(
const
FileName:
string
);
49
procedure
Play;
50
procedure
Next;
51
procedure
Prev;
52
procedure
Fast;
53
procedure
Slow;
54
procedure
SnapShot;
55
end
;
56
57
var
58
MainForm: TMainForm;
59
60
implementation
61
62
uses
63
ComObj;
64
65
{
$R *.DFM
}
66
67
procedure
TMainForm.SpeedButton1Click(Sender: TObject);
68
begin
69
if
OpenDialog.Execute
then
70
begin
71
GraphDestory;
72
OpenFile(OpenDialog.FileName)
73
end
74
end
;
75
76
procedure
TMainForm.FormCreate(Sender: TObject);
77
begin
78
CoInitialize(
nil
)
79
end
;
80
81
procedure
TMainForm.FormDestroy(Sender: TObject);
82
begin
83
GraphDestory;
84
85
CoUninitialize
86
end
;
87
88
procedure
TMainForm.OpenFile(
const
FileName:
string
);
89
var
90
PFileName:
array
[
0
..
255
]
of
WideChar;
91
Filter: IBaseFilter;
92
MediaType: TAM_MEDIA_TYPE;
93
Intf: IInterface;
94
begin
95
GraphDestory;
96
97
GraphBuilder:
=
CreateComObject(CLSID_FilterGraph)
as
IGraphBuilder;
98
99
Filter:
=
CreateComObject(CLSID_SampleGrabber)
as
IBaseFilter;
100
Filter.QueryInterface(IID_ISampleGrabber, SampleGrabber);
101
GraphBuilder.AddFilter(Filter,
'
Grabber
'
);
102
Filter:
=
nil
;
103
ZeroMemory(@MediaType, SizeOf(TAM_MEDIA_TYPE));
104
MediaType.majortype:
=
MEDIATYPE_Video;
105
MediaType.subtype:
=
MEDIASUBTYPE_RGB24;
106
MediaType.formattype:
=
FORMAT_VideoInfo;
107
SampleGrabber.SetMediaType(MediaType);
108
SampleGrabber.SetBufferSamples(True);
109
110
StringToWideChar(FileName, PFileName,
255
);
111
GraphBuilder.RenderFile(PFileName,
nil
);
112
113
GraphBuilder.QueryInterface(IID_IVideoWindow, VideoWindow);
114
VideoWindow.put_Owner(DisplayPanel.Handle);
115
VideoWindow.put_WindowStyle(WS_CHILD
or
WS_CLIPSIBLINGS);
116
VideoWindow.put_Visible(True);
117
DisplayPanelResize(
nil
);
118
119
GraphBuilder.QueryInterface(IID_IMediaSeeking, MediaSeek);
120
MediaSeek.SetTimeFormat(Time_Format_Frame);
121
122
GraphBuilder.QueryInterface(IID_IMediaControl, MediaControl);
123
124
GraphBuilder.QueryInterface(IID_IMediaEventEx, MediaEvent);
125
MediaEvent.SetNotifyWindow(Handle, WM_GraphNotify,
0
);
126
end
;
127
128
procedure
TMainForm.GraphDestory;
129
begin
130
if
VideoWindow
<>
nil
then
131
begin
132
VideoWindow.put_Visible(False);
133
VideoWindow.put_Owner(
0
)
134
end
;
135
VideoWindow:
=
nil
;
136
137
MediaControl:
=
nil
;
138
139
MediaEvent:
=
nil
;
140
141
GraphBuilder:
=
nil
142
end
;
143
144
procedure
TMainForm.DisplayPanelResize(Sender: TObject);
145
begin
146
if
VideoWindow
<>
nil
then
147
VideoWindow.SetWindowPosition(
0
,
0
, DisplayPanel.Width, DisplayPanel.Height)
148
end
;
149
150
procedure
TMainForm.SpeedButton2Click(Sender: TObject);
151
begin
152
Play
153
end
;
154
155
procedure
TMainForm.WMGraphNotify(
var
Msg: TMessage);
156
var
157
EventCode: Integer;
158
Param1, Param2: Integer;
159
CurrentPosition, EndPosition: Int64;
160
begin
161
if
MediaEvent
<>
nil
then
162
begin
163
while
MediaEvent.GetEvent(EventCode, Param1, Param2,
0
)
=
S_OK
do
164
begin
165
MediaEvent.FreeEventParams(EventCode, Param1, Param2);
166
if
EventCode
=
EC_Complete
then
167
begin
168
if
MediaControl
<>
nil
then
169
MediaControl.Stop;
170
if
MediaSeek
<>
nil
then
171
begin
172
CurrentPosition:
=
0
;
173
MediaSeek.SetPositions(CurrentPosition,
174
AM_SEEKING_AbsolutePositioning,
175
EndPosition, AM_SEEKING_NoPositioning)
176
end
177
end
178
end
179
end
180
end
;
181
182
procedure
TMainForm.SpeedButton3Click(Sender: TObject);
183
begin
184
Next
185
end
;
186
187
procedure
TMainForm.SpeedButton4Click(Sender: TObject);
188
begin
189
Prev
190
end
;
191
192
procedure
TMainForm.SpeedButton5Click(Sender: TObject);
193
begin
194
Fast
195
end
;
196
197
procedure
TMainForm.SpeedButton6Click(Sender: TObject);
198
begin
199
Slow
200
end
;
201
202
procedure
TMainForm.SpeedButton7Click(Sender: TObject);
203
begin
204
SnapShot
205
end
;
206
207
procedure
TMainForm.Play;
208
begin
209
if
MediaControl
<>
nil
then
210
MediaControl.Run
211
end
;
212
213
procedure
TMainForm.Next;
214
var
215
CurrentPosition, EndPosition: Int64;
216
begin
217
if
MediaControl
<>
nil
then
218
MediaControl.Pause;
219
if
MediaSeek
<>
nil
then
220
begin
221
MediaSeek.GetPositions(CurrentPosition, EndPosition);
222
Inc(CurrentPosition);
223
MediaSeek.SetPositions(CurrentPosition, AM_SEEKING_AbsolutePositioning,
224
EndPosition, AM_SEEKING_NoPositioning)
225
end
226
end
;
227
228
procedure
TMainForm.Prev;
229
var
230
CurrentPosition, EndPosition: Int64;
231
begin
232
if
MediaControl
<>
nil
then
233
MediaControl.Pause;
234
if
MediaSeek
<>
nil
then
235
begin
236
MediaSeek.GetPositions(CurrentPosition, EndPosition);
237
Dec(CurrentPosition);
238
MediaSeek.SetPositions(CurrentPosition, AM_SEEKING_AbsolutePositioning,
239
EndPosition, AM_SEEKING_NoPositioning)
240
end
241
end
;
242
243
procedure
TMainForm.Fast;
244
begin
245
if
MediaSeek
<>
nil
then
246
MediaSeek.SetRate(
2
)
247
end
;
248
249
procedure
TMainForm.Slow;
250
begin
251
if
MediaSeek
<>
nil
then
252
MediaSeek.SetRate(
0.125
)
253
end
;
254
255
procedure
TMainForm.SnapShot;
256
var
257
MediaType: TAM_MEDIA_TYPE;
258
VideoInfoHeader: TVideoInfoHeader;
259
BitmapInfo: TBitmapInfo;
260
Bitmap: HBitmap;
261
Buffer: Pointer;
262
BufferSize: Integer;
263
begin
264
SampleGrabber.GetConnectedMediaType(MediaType);
265
266
ZeroMemory(@VideoInfoHeader, SizeOf(TVideoInfoHeader));
267
CopyMemory(@VideoInfoHeader, MediaType.pbFormat, SizeOf(VideoInfoHeader));
268
269
ZeroMemory(@BitmapInfo, SizeOf(TBitmapInfo));
270
CopyMemory(@BitmapInfo, @VideoInfoHeader.bmiHeader, SizeOf(VideoInfoHeader.bmiHeader));
271
272
Bitmap:
=
CreateDIBSection(
0
, BitmapInfo, DIB_RGB_COLORS, Buffer,
0
,
0
);
273
SampleGrabber.GetCurrentBuffer(BufferSize, Buffer);
274
275
Image1.Picture.Bitmap.Handle:
=
Bitmap
276
end
;
277
278
end
.
279

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

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232

233

234

235

236

237

238

239

240

241

242

243

244

245

246

247

248

249

250

251

252

253

254

255

256

257

258

259

260

261

262

263

264

265

266

267

268

269

270

271

272

273

274

275

276

277

278

279
