本文演示如何使用 Bass.dll 的 BASS_ChannelSlideAttribute 與 BASS_ChannelGetAttribute 動態調整並讀取播放速度(採樣率),配合 TrackBar 實現變速播放 UI。

unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls;
type
TForm1 = class(TForm)
OpenDialog1: TOpenDialog;
Button1: TButton; { 打開 }
Button2: TButton; { 播放 }
Button3: TButton; { 暫停 }
TrackBar1: TTrackBar; { 速度滑桿 }
Label1: TLabel; { 顯示速度比例 }
Button4: TButton; { 恢復原速 }
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure TrackBar1Change(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button4Click(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses Bass;
var
HS: HSTREAM; { 流句柄 }
procedure TForm1.FormCreate(Sender: TObject);
begin
TrackBar1.ShowSelRange := False;
TrackBar1.Height := 23;
TrackBar1.Max := 100000; { 最大採樣率 }
TrackBar1.Min := 100; { 最小採樣率 }
TrackBar1.Position := 44100; { 預設 44.1kHz }
if HiWord(BASS_GetVersion) <> BASSVERSION then
MessageBox(0, '"Bass.dll" 文件版本不合適!', nil, MB_ICONERROR);
if not BASS_Init(-1, 44100, 0, 0, nil) then
ShowMessage('初始化錯誤');
end;
{ 打開檔案 }
procedure TForm1.Button1Click(Sender: TObject);
var
Mp3Path: AnsiString;
begin
BASS_StreamFree(HS);
OpenDialog1.Filter := 'Mp3 文件(*.mp3)|*.mp3|Wav 文件(*.wav)|*.wav';
if OpenDialog1.Execute then
Mp3Path := AnsiString(OpenDialog1.FileName);
HS := BASS_StreamCreateFile(False, PAnsiChar(Mp3Path), 0, 0, 0);
if HS = 0 then
Caption := '打開失敗'
else
begin
Caption := String(Mp3Path);
Button4.Click; { 重置為原速 }
end;
end;
{ 播放 }
procedure TForm1.Button2Click(Sender: TObject);
begin
BASS_ChannelPlay(HS, False);
end;
{ 暫停 }
procedure TForm1.Button3Click(Sender: TObject);
begin
BASS_ChannelPause(HS);
end;
{ 恢復原速 }
procedure TForm1.Button4Click(Sender: TObject);
begin
TrackBar1.Position := 44100;
end;
{ 設置/獲取播放速度 }
procedure TForm1.TrackBar1Change(Sender: TObject);
var
Freq: Single;
begin
Freq := 44100;
{ 平滑滑動到目標採樣率,0 表示立即生效 }
BASS_ChannelSlideAttribute(HS, BASS_ATTRIB_FREQ, TrackBar1.Position, 0);
{ 讀取當前實際採樣率 }
BASS_ChannelGetAttribute(HS, BASS_ATTRIB_FREQ, Freq);
Label1.Caption := Format('當前速度比例: %.2f%%', [Freq / 44100 * 100]);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
BASS_Free;
end;
end.
| 函數 | 用途 | 關鍵參數 |
|---|---|---|
BASS_ChannelSlideAttribute | 平滑過渡屬性值 | Handle, BASS_ATTRIB_FREQ, TargetValue, TimeMS |
BASS_ChannelGetAttribute | 讀取當前屬性值 | Handle, BASS_ATTRIB_FREQ, var Value |
BASS_ATTRIB_FREQ | 採樣率屬性 ID | 單位 Hz,預設 44100 |
Min=100:約 0.23% 原速(極慢)。Max=100000:約 227% 原速(極快)。Position=44100:標準 CD 音質採樣率,對應 100% 速度。BASS_FX_TEMPO 流。BASS_ChannelSlideAttribute 最後一個參數 TimeMS 設為 >0 可實現漸變(如 500ms 渐變),體驗更佳。| 現象 | 原因 | 解決 |
|---|---|---|
| 調整 TrackBar 無反應 | 流句柄 HS=0 或未播放 | 確認 BASS_StreamCreateFile 成功且 BASS_ChannelPlay |
| 速度歸零/極慢 | TrackBar.Position 過小 | 設置合理 Min(建議 ≥ 8000) |
| 音頻失真 | 採樣率超出硬體支援範圍 | 限制 Max ≤ 96000(視聲卡) |
通過 BASS_ATTRIB_FREQ 實現變速播放簡單高效,結合 TrackBar 即可構建直觀的音頻速度控制介面。