【发布时间】:2012-02-16 09:08:17
【问题描述】:
我想从某处手动加载bass dll,然后播放一个mp3 文件。怎么做?德尔福 XE2。
我的尝试不起作用:
type
QWORD = Int64;
HSTREAM = LongWord;
type
TBASS_ChannelPlay = function(handle: HSTREAM; restart: LongBool): LongBool; stdcall;
type
TBASS_StreamCreateFile = function(mem: LongBool; f: Pointer;
offset, length: QWORD; flags: LongWord): HSTREAM; stdcall;
procedure PlayMP3(FileName: string);
var
BASS_ChannelPlay: TBASS_ChannelPlay;
BASS_StreamCreateFile: TBASS_StreamCreateFile;
DllHandle: THandle;
MP3Stream: HSTREAM;
DllPath:string;
pFileName:pchar;
begin
DllPath:= 'c:\dll\bass.dll';
DllHandle := LoadLibrary(pchar(DLLPath));
try
if DllHandle = 0 then
Exit;
@BASS_StreamCreateFile := GetProcAddress(DllHandle,
'BASS_StreamCreateFile');
if @BASS_StreamCreateFile <> nil then
begin
pfilename:=pchar(FileName);
MP3Stream := BASS_StreamCreateFile(false, Pfilename, 0, 0, 0);
if MP3Stream <> 0 then
begin
@BASS_ChannelPlay := GetProcAddress(DllHandle, 'BASS_ChannelPlay');
if @BASS_ChannelPlay <> nil then
BASS_ChannelPlay(MP3Stream,false);
end;
end;
finally
FreeLibrary(DllHandle);
end;
end;
但是 BASS_StreamCreateFile 一直返回 0 :(
他们的示例(Bass Test)和 Bass.pas 中的代码:
type
DWORD = LongWord;
BOOL = LongBool;
QWORD = Int64;
HSTREAM = DWORD;
function BASS_StreamCreateFile(mem: BOOL; f: Pointer; offset, length: QWORD; flags: DWORD): HSTREAM; {$IFDEF WIN32}stdcall{$ELSE}cdecl{$ENDIF}; external bassdll;
strs: array[0..128] of HSTREAM;
procedure TForm1.Button15Click(Sender: TObject);
var
f: PChar;
begin
if not OpenDialog2.Execute then Exit;
f := PChar(OpenDialog2.FileName);
strs[strc] := BASS_StreamCreateFile(False, f, 0, 0, 0 {$IFDEF UNICODE} or BASS_UNICODE {$ENDIF});
if strs[strc] <> 0 then
begin
ListBox3.Items.Add(OpenDialog2.FileName);
Inc(strc);
end
else
Error('Error creating stream!');
end;
添加
MP3Stream := BASS_StreamCreateFile(false, Pfilename, 0, 0, 0);
ShowMessage(SysErrorMessage(GetLastError));
GetLastError 没有显示任何错误!
添加
还有 BASS 2.4 Delphi 单元(动态)。
上面写着:
如何安装 将 DYNAMIC_BASS.PAS 复制到 \LIB 的子目录 您的 Delphi 路径或您的项目目录调用 Load_BASSDLL(例如在 FormCreate) 在使用任何功能之前加载 BASS,以及
Unload_BASSDLL(例如在 FormDestory 中)在您完成后将其卸载。注意:Delphi 2009 用户应使用 BASS_UNICODE 标志,其中 可能
我愿意:
if Load_BASSDLL(DllPath) then
begin
FileName:='C:\Users\V\Desktop\cmd.mp3';
MP3Stream:=BASS_StreamCreateFile(False, pchar(FileName), 0, 0, 0 {$IFDEF UNICODE} or BASS_UNICODE {$ENDIF});
if MP3Stream <> 0 then
BASS_ChannelPlay(MP3Stream, False);
Unload_BASSDLL;
end;
还是不行:(
补充:
如果这样做
BASS_Init(-1, 44100, 0, Form1.Handle, nil);
然后BASS_ChannelPlay(MP3Stream, False) 返回 true 但我没有听到声音:(
【问题讨论】:
-
再次阅读我编辑的答案。如果您查看
dynamic_bass.pas,尤其是Load_BASSDLL的代码,它不会调用BASS_Init。它只是加载库并执行所有GetProcAddress调用。
标签: delphi function mp3 bass.dll