簡體   English   中英

Delphi:加載BASS DLL並播放MP3

[英]Delphi: load BASS DLL and play MP3

我想從某個地方手動加載一個低音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復制到Delphi路徑的\\ LIB子目錄或項目目錄中調用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但我聽不到聲音:(

你錯過了對BASS_Init的調用。 FormCreate事件中引用的相同演示中:

// Initialize audio - default device, 44100hz, stereo, 16 bits
if not BASS_Init(-1, 44100, 0, Handle, nil) then
  Error('Error initializing audio!'); 

另外,看一下demo源的調用:

BASS_StreamCreateFile(False, f, 0, 0, 
 0 {$IFDEF UNICODE} or BASS_UNICODE {$ENDIF});

注意最后一個參數會發生什么? D2009及以上版本需要or BASS_UNICODE ,除非您使用的是PAnsiChar而不是PChar ; Delphi的默認字符串類型是UnicodeString ,默認的PCharPWideChar

您可以將它與{$IFDEF UNICODE}或不使用它; Delphi定義了UNICODE ,因此如果您使用它,您的代碼也將與早期版本的Delphi(D2009之前版本)向后兼容。

您還應該查看Bass\\Delphi\\dynamic文件夾中的dynamic_bass.pas 它有代碼來動態加載庫並檢索所有函數; 如果你不想直接使用它,至少你可以從那里復制你需要的函數定義和動態加載代碼。

建議 - 只是不要手動加載.dll。 忘記“LoadDll”並且特別忘記了所有那些蹩腳,低級別的Win3.0時代“GetProcAddress()”的廢話。

只需聲明一個外部,就像工作的Bass示例代碼成功完成:

function BASS_StreamCreateFile(
           mem: BOOL; 
           f: Pointer; 
           offset, length: QWORD; 
           flags: DWORD): HSTREAM; 
{$IFDEF WIN32}stdcall{$ELSE}cdecl{$ENDIF}; external bassdll;

PS:如果你真的,真的,真的堅持LoadDll()和朋友,那么:

  1. 請記住,Delphi XE字符串現在是16位Unicode

  2. 檢查GetLastError()以確定為什么 LoadDll返回一個空句柄。

PPS:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM