http://download.pudn.com/downloads36/sourcecode/windows/multimedia/31767658%D2%BB%B8%F6%C4%DA%B4%E6%C1%F7%B2%A5%B7%C5%B5%C4%C0%FD%D7%D3.zip这里有一个播放流的例子,安装好里面的过滤器以后他自己已经编译好的工程DSPlayerAsyncStreamSourceExample.exe这个就能直接打开文件用流播放,但是里面的工程examples\StreamSource\DSPlayerAsyncStreamExample.dpr
重新编译以后用来播放就会出错:提示Access violation at address 00000000 。read of address 00000000;
unit DSPlayerAsyncStreamSourceExample;点击按钮打开文件的时候在装入内存流的时候出错!请高手指导。
procedure TForm1.Button1Click(Sender: TObject);
begin
if not OpenDialog1.Execute then exit;
NilAll;
CheckDSError(CoCreateInstance(TGUID(CLSID_FilterGraph), NIL, CLSCTX_INPROC,
TGUID(IID_IGraphBuilder), g_GraphBuilder)) ;
CheckDSError(g_GraphBuilder.QueryInterface(IID_IMediaControl, g_MediaControl));
CheckDSError(CoCreateInstance(CLSID_DSPlayerAsyncSource,NIL, CLSCTX_INPROC,
IID_IBaseFilter, g_DSPlayerFileSource));
CheckDSError(g_DSPlayerFileSource.QueryInterface(IID_IStreamLoad,
g_StreamSource));
if g_FileStream <> nil then g_FileStream.Free;
g_FileStream := TFileStream.Create(OpenDialog1.FileName, fmOpenRead);
CheckDSError(g_StreamSource.LoadFromStream(g_FileStream));\\就是这里出错
CheckDSError(g_DSPlayerFileSource.FindPin(pinID, g_Pin));
CheckDSError(g_GraphBuilder.AddFilter(g_DSPlayerFileSource,
StringToOleStr('DSPlayer Async FileSource')));
CheckDSError(g_GraphBuilder.Render(g_Pin));
CheckDSError(g_MediaControl.Run);
if g_count = 0 then begin
g_count := g_count+1;
CheckDSError(dsutil.ShowFilterPropertyPage(0,g_DSPlayerFileSource));
end;end;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DirectShow9, ActiveX, StdCtrls, DSUtil;type
TForm1 = class(TForm)
Button1: TButton;
OpenDialog1: TOpenDialog;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Button5: TButton;
procedure Button1Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
private procedure NilAll();
public
end;IStreamLoad = interface(IUnknown) ['{3E0FA056-926C-43d9-BA18-EF16E980913B}']
function LoadFromStream(f_Stream: TStream) : HRESULT; stdcall;
end;var
Form1: TForm1;
g_GraphBuilder : IGraphBuilder = NIL;
g_MediaControl : IMediaControl = NIL;
g_DSPlayerFileSource : IBaseFilter = NIL;
g_StreamSource : IStreamLoad = NIL;
g_Pin : IPin = NIL;
g_count : integer = 0;
g_FileStream : TFileStream = NIL;const
CLSID_DSPlayerAsyncSource : TGUID = '{3E0FA044-926C-42d9-BA12-EF16E980913B}';
IID_IStreamLoad : TGUID = '{3E0FA056-926C-43d9-BA18-EF16E980913B}';
pinID = 'StreamOut';
implementation{$R *.dfm}procedure TForm1.NilAll();
begin
if Assigned(g_MediaControl) then CheckDSError(g_MediaControl.Stop);
if Assigned(g_Pin) then g_Pin := nil;
if Assigned(g_StreamSource) then g_StreamSource := nil;
if Assigned(g_DSPlayerFileSource) then g_DSPlayerFileSource := nil;
if Assigned(g_MediaControl) then g_MediaControl := nil;
if Assigned(g_GraphBuilder) then g_GraphBuilder := nil;
end;procedure TForm1.Button1Click(Sender: TObject);
begin
if not OpenDialog1.Execute then exit;
NilAll;
CheckDSError(CoCreateInstance(TGUID(CLSID_FilterGraph), NIL, CLSCTX_INPROC,
TGUID(IID_IGraphBuilder), g_GraphBuilder)) ;
CheckDSError(g_GraphBuilder.QueryInterface(IID_IMediaControl, g_MediaControl));
CheckDSError(CoCreateInstance(CLSID_DSPlayerAsyncSource,NIL, CLSCTX_INPROC,
IID_IBaseFilter, g_DSPlayerFileSource));
CheckDSError(g_DSPlayerFileSource.QueryInterface(IID_IStreamLoad,
g_StreamSource));
if g_FileStream <> nil then g_FileStream.Free;
g_FileStream := TFileStream.Create(OpenDialog1.FileName, fmOpenRead);
CheckDSError(g_StreamSource.LoadFromStream(g_FileStream));\\就是这里出错
CheckDSError(g_DSPlayerFileSource.FindPin(pinID, g_Pin));
CheckDSError(g_GraphBuilder.AddFilter(g_DSPlayerFileSource,
StringToOleStr('DSPlayer Async FileSource')));
CheckDSError(g_GraphBuilder.Render(g_Pin));
CheckDSError(g_MediaControl.Run);
if g_count = 0 then begin
g_count := g_count+1;
CheckDSError(dsutil.ShowFilterPropertyPage(0,g_DSPlayerFileSource));
end;end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
NilAll;
end;procedure TForm1.Button2Click(Sender: TObject);
begin
if Assigned(g_MediaControl) then CheckDSError(g_MediaControl.Run);
end;procedure TForm1.Button3Click(Sender: TObject);
begin
if Assigned(g_MediaControl) then CheckDSError(g_MediaControl.Pause);
end;procedure TForm1.Button4Click(Sender: TObject);
begin
if Assigned(g_MediaControl) then CheckDSError(g_MediaControl.Stop);
end;procedure TForm1.Button5Click(Sender: TObject);
begin
CheckDSError(dsutil.ShowFilterPropertyPage(0,g_DSPlayerFileSource));
end;end.
重新编译以后用来播放就会出错:提示Access violation at address 00000000 。read of address 00000000;
unit DSPlayerAsyncStreamSourceExample;点击按钮打开文件的时候在装入内存流的时候出错!请高手指导。
procedure TForm1.Button1Click(Sender: TObject);
begin
if not OpenDialog1.Execute then exit;
NilAll;
CheckDSError(CoCreateInstance(TGUID(CLSID_FilterGraph), NIL, CLSCTX_INPROC,
TGUID(IID_IGraphBuilder), g_GraphBuilder)) ;
CheckDSError(g_GraphBuilder.QueryInterface(IID_IMediaControl, g_MediaControl));
CheckDSError(CoCreateInstance(CLSID_DSPlayerAsyncSource,NIL, CLSCTX_INPROC,
IID_IBaseFilter, g_DSPlayerFileSource));
CheckDSError(g_DSPlayerFileSource.QueryInterface(IID_IStreamLoad,
g_StreamSource));
if g_FileStream <> nil then g_FileStream.Free;
g_FileStream := TFileStream.Create(OpenDialog1.FileName, fmOpenRead);
CheckDSError(g_StreamSource.LoadFromStream(g_FileStream));\\就是这里出错
CheckDSError(g_DSPlayerFileSource.FindPin(pinID, g_Pin));
CheckDSError(g_GraphBuilder.AddFilter(g_DSPlayerFileSource,
StringToOleStr('DSPlayer Async FileSource')));
CheckDSError(g_GraphBuilder.Render(g_Pin));
CheckDSError(g_MediaControl.Run);
if g_count = 0 then begin
g_count := g_count+1;
CheckDSError(dsutil.ShowFilterPropertyPage(0,g_DSPlayerFileSource));
end;end;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DirectShow9, ActiveX, StdCtrls, DSUtil;type
TForm1 = class(TForm)
Button1: TButton;
OpenDialog1: TOpenDialog;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Button5: TButton;
procedure Button1Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
private procedure NilAll();
public
end;IStreamLoad = interface(IUnknown) ['{3E0FA056-926C-43d9-BA18-EF16E980913B}']
function LoadFromStream(f_Stream: TStream) : HRESULT; stdcall;
end;var
Form1: TForm1;
g_GraphBuilder : IGraphBuilder = NIL;
g_MediaControl : IMediaControl = NIL;
g_DSPlayerFileSource : IBaseFilter = NIL;
g_StreamSource : IStreamLoad = NIL;
g_Pin : IPin = NIL;
g_count : integer = 0;
g_FileStream : TFileStream = NIL;const
CLSID_DSPlayerAsyncSource : TGUID = '{3E0FA044-926C-42d9-BA12-EF16E980913B}';
IID_IStreamLoad : TGUID = '{3E0FA056-926C-43d9-BA18-EF16E980913B}';
pinID = 'StreamOut';
implementation{$R *.dfm}procedure TForm1.NilAll();
begin
if Assigned(g_MediaControl) then CheckDSError(g_MediaControl.Stop);
if Assigned(g_Pin) then g_Pin := nil;
if Assigned(g_StreamSource) then g_StreamSource := nil;
if Assigned(g_DSPlayerFileSource) then g_DSPlayerFileSource := nil;
if Assigned(g_MediaControl) then g_MediaControl := nil;
if Assigned(g_GraphBuilder) then g_GraphBuilder := nil;
end;procedure TForm1.Button1Click(Sender: TObject);
begin
if not OpenDialog1.Execute then exit;
NilAll;
CheckDSError(CoCreateInstance(TGUID(CLSID_FilterGraph), NIL, CLSCTX_INPROC,
TGUID(IID_IGraphBuilder), g_GraphBuilder)) ;
CheckDSError(g_GraphBuilder.QueryInterface(IID_IMediaControl, g_MediaControl));
CheckDSError(CoCreateInstance(CLSID_DSPlayerAsyncSource,NIL, CLSCTX_INPROC,
IID_IBaseFilter, g_DSPlayerFileSource));
CheckDSError(g_DSPlayerFileSource.QueryInterface(IID_IStreamLoad,
g_StreamSource));
if g_FileStream <> nil then g_FileStream.Free;
g_FileStream := TFileStream.Create(OpenDialog1.FileName, fmOpenRead);
CheckDSError(g_StreamSource.LoadFromStream(g_FileStream));\\就是这里出错
CheckDSError(g_DSPlayerFileSource.FindPin(pinID, g_Pin));
CheckDSError(g_GraphBuilder.AddFilter(g_DSPlayerFileSource,
StringToOleStr('DSPlayer Async FileSource')));
CheckDSError(g_GraphBuilder.Render(g_Pin));
CheckDSError(g_MediaControl.Run);
if g_count = 0 then begin
g_count := g_count+1;
CheckDSError(dsutil.ShowFilterPropertyPage(0,g_DSPlayerFileSource));
end;end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
NilAll;
end;procedure TForm1.Button2Click(Sender: TObject);
begin
if Assigned(g_MediaControl) then CheckDSError(g_MediaControl.Run);
end;procedure TForm1.Button3Click(Sender: TObject);
begin
if Assigned(g_MediaControl) then CheckDSError(g_MediaControl.Pause);
end;procedure TForm1.Button4Click(Sender: TObject);
begin
if Assigned(g_MediaControl) then CheckDSError(g_MediaControl.Stop);
end;procedure TForm1.Button5Click(Sender: TObject);
begin
CheckDSError(dsutil.ShowFilterPropertyPage(0,g_DSPlayerFileSource));
end;end.
CheckDSError(g_StreamSource.LoadFromStream(g_FileStream));\\就是这里出错 这里不是实例化了吗
我也碰到类似问题,发一份给过来看看,谢谢!
[email protected]
谢谢