procedure TMainForm.GraphDestory; begin if VideoWindow<>nil then begin VideoWindow.put_Visible(False); VideoWindow.put_Owner(0) end; VideoWindow:=nil;
MediaControl:=nil;
MediaEvent:=nil;
GraphBuilder:=nil end;
procedure TMainForm.DisplayPanelResize(Sender: TObject); begin if VideoWindow<>nil then VideoWindow.SetWindowPosition(0, 0, DisplayPanel.Width, DisplayPanel.Height) end;
procedure TMainForm.SpeedButton2Click(Sender: TObject); begin Play end;
procedure TMainForm.WMGraphNotify(var Msg: TMessage); var EventCode: Integer; Param1, Param2: Integer; CurrentPosition, EndPosition: Int64; begin if MediaEvent<>nil then begin while MediaEvent.GetEvent(EventCode, Param1, Param2, 0)=S_OK do begin MediaEvent.FreeEventParams(EventCode, Param1, Param2); if EventCode=EC_Complete then begin if MediaControl<>nil then MediaControl.Stop; if MediaSeek<>nil then begin CurrentPosition:=0; MediaSeek.SetPositions(CurrentPosition, AM_SEEKING_AbsolutePositioning, EndPosition, AM_SEEKING_NoPositioning) end end end end end;
procedure TMainForm.SpeedButton3Click(Sender: TObject); begin Next end;
procedure TMainForm.SpeedButton4Click(Sender: TObject); begin Prev end;
procedure TMainForm.SpeedButton5Click(Sender: TObject); begin Fast end;
procedure TMainForm.SpeedButton6Click(Sender: TObject); begin Slow end;
procedure TMainForm.SpeedButton7Click(Sender: TObject); begin SnapShot end;
procedure TMainForm.Play; begin if MediaControl<>nil then MediaControl.Run end;
procedure TMainForm.Next; var CurrentPosition, EndPosition: Int64; begin if MediaControl<>nil then MediaControl.Pause; if MediaSeek<>nil then begin MediaSeek.GetPositions(CurrentPosition, EndPosition); Inc(CurrentPosition); MediaSeek.SetPositions(CurrentPosition, AM_SEEKING_AbsolutePositioning, EndPosition, AM_SEEKING_NoPositioning) end end;
procedure TMainForm.Prev; var CurrentPosition, EndPosition: Int64; begin if MediaControl<>nil then MediaControl.Pause; if MediaSeek<>nil then begin MediaSeek.GetPositions(CurrentPosition, EndPosition); Dec(CurrentPosition); MediaSeek.SetPositions(CurrentPosition, AM_SEEKING_AbsolutePositioning, EndPosition, AM_SEEKING_NoPositioning) end end;
procedure TMainForm.Fast; begin if MediaSeek<>nil then MediaSeek.SetRate(2) end;
procedure TMainForm.Slow; begin if MediaSeek<>nil then MediaSeek.SetRate(0.125) end;
procedure TMainForm.SnapShot; var MediaType: TAM_MEDIA_TYPE; VideoInfoHeader: TVideoInfoHeader; BitmapInfo: TBitmapInfo; Bitmap: HBitmap; Buffer: Pointer; BufferSize: Integer; begin SampleGrabber.GetConnectedMediaType(MediaType);
我用delphi7中的组件windowsmeidaplayer(system中),filename选路径,autoopen选true,运行时报错;"无法通过给定的扩展名确定设备类型",怎么才能使用这个组件?
有什么经验说一下吧,我也初学。
我是对这方面感兴趣,自学了一点点而以。
如果是初学,DSPack已经能够满足很多需要了。
如果要深入进去的话,必须把接口和COM相关的学习一下。还要多看看DXSDK。
我现在最多只能用用Filter。很想开发自已的Filter,但能力不够。
用DirectShow,再装个完整点的音视频解码包,99%的媒体文件都可以播放了。
unit Main;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
DirectShow, ExtCtrls, Buttons, ActiveX;
const
WM_GraphNotify = WM_App+1;
type
TMainForm = class(TForm)
DisplayPanel: TPanel;
SpeedButton1: TSpeedButton;
SpeedButton2: TSpeedButton;
SpeedButton3: TSpeedButton;
SpeedButton4: TSpeedButton;
SpeedButton5: TSpeedButton;
SpeedButton6: TSpeedButton;
SpeedButton7: TSpeedButton;
Image1: TImage;
OpenDialog: TOpenDialog;
procedure SpeedButton1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure DisplayPanelResize(Sender: TObject);
procedure SpeedButton2Click(Sender: TObject);
procedure SpeedButton3Click(Sender: TObject);
procedure SpeedButton4Click(Sender: TObject);
procedure SpeedButton5Click(Sender: TObject);
procedure SpeedButton6Click(Sender: TObject);
procedure SpeedButton7Click(Sender: TObject);
private
{ Private declarations }
protected
procedure WMGraphNotify(var Msg: TMessage); message WM_GraphNotify;
public
{ Public declarations }
GraphBuilder: IGraphBuilder;
VideoWindow: IVideoWindow;
MediaControl: IMediaControl;
MediaEvent: IMediaEventEx;
MediaSeek: IMediaSeeking;
SampleGrabber: ISampleGrabber;
procedure GraphDestory;
procedure OpenFile(const FileName: string);
procedure Play;
procedure Next;
procedure Prev;
procedure Fast;
procedure Slow;
procedure SnapShot;
end;
var
MainForm: TMainForm;
implementation
uses
ComObj;
{$R *.DFM}
procedure TMainForm.SpeedButton1Click(Sender: TObject);
begin
if OpenDialog.Execute then
begin
GraphDestory;
OpenFile(OpenDialog.FileName)
end
end;
procedure TMainForm.FormCreate(Sender: TObject);
begin
CoInitialize(nil)
end;
procedure TMainForm.FormDestroy(Sender: TObject);
begin
GraphDestory;
CoUninitialize
end;
procedure TMainForm.OpenFile(const FileName: string);
var
PFileName: array [0..255] of WideChar;
Filter: IBaseFilter;
MediaType: TAM_MEDIA_TYPE;
Intf: IInterface;
begin
GraphDestory;
GraphBuilder:=CreateComObject(CLSID_FilterGraph) as IGraphBuilder;
Filter:=CreateComObject(CLSID_SampleGrabber) as IBaseFilter;
Filter.QueryInterface(IID_ISampleGrabber, SampleGrabber);
GraphBuilder.AddFilter(Filter, 'Grabber');
Filter:=nil;
ZeroMemory(@MediaType, SizeOf(TAM_MEDIA_TYPE));
MediaType.majortype:=MEDIATYPE_Video;
MediaType.subtype:=MEDIASUBTYPE_RGB24;
MediaType.formattype:=FORMAT_VideoInfo;
SampleGrabber.SetMediaType(MediaType);
SampleGrabber.SetBufferSamples(True);
StringToWideChar(FileName, PFileName, 255);
GraphBuilder.RenderFile(PFileName, nil);
GraphBuilder.QueryInterface(IID_IVideoWindow, VideoWindow);
VideoWindow.put_Owner(DisplayPanel.Handle);
VideoWindow.put_WindowStyle(WS_CHILD or WS_CLIPSIBLINGS);
VideoWindow.put_Visible(True);
DisplayPanelResize(nil);
GraphBuilder.QueryInterface(IID_IMediaSeeking, MediaSeek);
MediaSeek.SetTimeFormat(Time_Format_Frame);
GraphBuilder.QueryInterface(IID_IMediaControl, MediaControl);
GraphBuilder.QueryInterface(IID_IMediaEventEx, MediaEvent);
MediaEvent.SetNotifyWindow(Handle, WM_GraphNotify, 0);
end;
procedure TMainForm.GraphDestory;
begin
if VideoWindow<>nil then
begin
VideoWindow.put_Visible(False);
VideoWindow.put_Owner(0)
end;
VideoWindow:=nil;
MediaControl:=nil;
MediaEvent:=nil;
GraphBuilder:=nil
end;
procedure TMainForm.DisplayPanelResize(Sender: TObject);
begin
if VideoWindow<>nil then
VideoWindow.SetWindowPosition(0, 0, DisplayPanel.Width, DisplayPanel.Height)
end;
procedure TMainForm.SpeedButton2Click(Sender: TObject);
begin
Play
end;
procedure TMainForm.WMGraphNotify(var Msg: TMessage);
var
EventCode: Integer;
Param1, Param2: Integer;
CurrentPosition, EndPosition: Int64;
begin
if MediaEvent<>nil then
begin
while MediaEvent.GetEvent(EventCode, Param1, Param2, 0)=S_OK do
begin
MediaEvent.FreeEventParams(EventCode, Param1, Param2);
if EventCode=EC_Complete then
begin
if MediaControl<>nil then
MediaControl.Stop;
if MediaSeek<>nil then
begin
CurrentPosition:=0;
MediaSeek.SetPositions(CurrentPosition,
AM_SEEKING_AbsolutePositioning,
EndPosition, AM_SEEKING_NoPositioning)
end
end
end
end
end;
procedure TMainForm.SpeedButton3Click(Sender: TObject);
begin
Next
end;
procedure TMainForm.SpeedButton4Click(Sender: TObject);
begin
Prev
end;
procedure TMainForm.SpeedButton5Click(Sender: TObject);
begin
Fast
end;
procedure TMainForm.SpeedButton6Click(Sender: TObject);
begin
Slow
end;
procedure TMainForm.SpeedButton7Click(Sender: TObject);
begin
SnapShot
end;
procedure TMainForm.Play;
begin
if MediaControl<>nil then
MediaControl.Run
end;
procedure TMainForm.Next;
var
CurrentPosition, EndPosition: Int64;
begin
if MediaControl<>nil then
MediaControl.Pause;
if MediaSeek<>nil then
begin
MediaSeek.GetPositions(CurrentPosition, EndPosition);
Inc(CurrentPosition);
MediaSeek.SetPositions(CurrentPosition, AM_SEEKING_AbsolutePositioning,
EndPosition, AM_SEEKING_NoPositioning)
end
end;
procedure TMainForm.Prev;
var
CurrentPosition, EndPosition: Int64;
begin
if MediaControl<>nil then
MediaControl.Pause;
if MediaSeek<>nil then
begin
MediaSeek.GetPositions(CurrentPosition, EndPosition);
Dec(CurrentPosition);
MediaSeek.SetPositions(CurrentPosition, AM_SEEKING_AbsolutePositioning,
EndPosition, AM_SEEKING_NoPositioning)
end
end;
procedure TMainForm.Fast;
begin
if MediaSeek<>nil then
MediaSeek.SetRate(2)
end;
procedure TMainForm.Slow;
begin
if MediaSeek<>nil then
MediaSeek.SetRate(0.125)
end;
procedure TMainForm.SnapShot;
var
MediaType: TAM_MEDIA_TYPE;
VideoInfoHeader: TVideoInfoHeader;
BitmapInfo: TBitmapInfo;
Bitmap: HBitmap;
Buffer: Pointer;
BufferSize: Integer;
begin
SampleGrabber.GetConnectedMediaType(MediaType);
ZeroMemory(@VideoInfoHeader, SizeOf(TVideoInfoHeader));
CopyMemory(@VideoInfoHeader, MediaType.pbFormat, SizeOf(VideoInfoHeader));
ZeroMemory(@BitmapInfo, SizeOf(TBitmapInfo));
CopyMemory(@BitmapInfo, @VideoInfoHeader.bmiHeader, SizeOf(VideoInfoHeader.bmiHeader));
Bitmap:=CreateDIBSection(0, BitmapInfo, DIB_RGB_COLORS, Buffer, 0, 0);
SampleGrabber.GetCurrentBuffer(BufferSize, Buffer);
Image1.Picture.Bitmap.Handle:=Bitmap
end;
end.