首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

Delphi Bass.dll 播放 MP3 系列(15):播放速度設置與獲取(BASS_ATTRIB_FREQ)

     編輯:Delphi

本文演示如何使用 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.

關鍵 API 解析

函數用途關鍵參數
BASS_ChannelSlideAttribute平滑過渡屬性值Handle, BASS_ATTRIB_FREQ, TargetValue, TimeMS
BASS_ChannelGetAttribute讀取當前屬性值Handle, BASS_ATTRIB_FREQ, var Value
BASS_ATTRIB_FREQ採樣率屬性 ID單位 Hz,預設 44100

TrackBar 參數設計

  • Min=100:約 0.23% 原速(極慢)。
  • Max=100000:約 227% 原速(極快)。
  • Position=44100:標準 CD 音質採樣率,對應 100% 速度。

進階提示

  1. 音調補償:單純改變採樣率會改變音調(變速即變調)。若需變速不變調,需使用 Bass_FX 擴展的 BASS_FX_TEMPO 流。
  2. 平滑過渡:BASS_ChannelSlideAttribute 最後一個參數 TimeMS 設為 >0 可實現漸變(如 500ms 渐變),體驗更佳。
  3. 保存速度設定:可將用戶偏好寫入配置檔,下次啟動自動套用。

常見問題

現象原因解決
調整 TrackBar 無反應流句柄 HS=0 或未播放確認 BASS_StreamCreateFile 成功且 BASS_ChannelPlay
速度歸零/極慢TrackBar.Position 過小設置合理 Min(建議 ≥ 8000)
音頻失真採樣率超出硬體支援範圍限制 Max ≤ 96000(視聲卡)

通過 BASS_ATTRIB_FREQ 實現變速播放簡單高效,結合 TrackBar 即可構建直觀的音頻速度控制介面。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved