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

Delphi 利用 TMediaPlayer 製作簡易錄音機:WAV 文件頭手動構建與錄製流程

     編輯:Delphi

靈感來源

TMediaPlayer 不僅能播放多媒體,配合 dtAutoSelect 和 StartRecording 還能錄製聲音。但它不自動寫入 WAV 文件頭,需開發者手動創建帶正確頭信息的空 WAV 文件,再讓 MediaPlayer 追加寫入音頻數據。

WAV 文件頭結構

TWavHeader = record
  rId: Longint;       // 'RIFF' = $46464952
  rLen: Longint;      // 文件總長 - 8 (此處佔位 36,實際錄製後需更新)
  wId: Longint;       // 'WAVE' = $45564157
  fId: Longint;       // 'fmt ' = $20746D66
  fLen: Longint;      // fmt 塊長度 = 16 (PCM)
  wFormatTag: Word;   // 1 = PCM
  nChannels: Word;    // 1=單聲道, 2=立體聲
  nSamplesPerSec: Longint; // 採樣率: 11025, 22050, 44100
  nAvgBytesPerSec: Longint; // nChannels * nSamplesPerSec * (wBitsPerSample/8)
  nBlockAlign: Word;  // nChannels * (wBitsPerSample/8)
  wBitsPerSample: Word; // 8 或 16
  dId: Longint;       // 'data' = $61746164
  wSampleLength: Longint; // 數據塊長度 (錄製前為 0)
end;

創建 WAV 頭文件過程

procedure TForm1.CreateWav(channels, resolution: Word; rate: Longint; fn: string);
var wf: file of TWavHeader; wh: TWavHeader;
begin
  wh.rId := $46464952; wh.rLen := 36; wh.wId := $45564157;
  wh.fId := $20746D66; wh.fLen := 16; wh.wFormatTag := 1;
  wh.nChannels := channels; wh.nSamplesPerSec := rate;
  wh.nAvgBytesPerSec := channels * rate * (resolution div 8);
  wh.nBlockAlign := channels * (resolution div 8);
  wh.wBitsPerSample := resolution;
  wh.dId := $61746164; wh.wSampleLength := 0; // 數據長度錄製後由 MediaPlayer 更新
  AssignFile(wf, fn); Rewrite(wf); Write(wf, wh); CloseFile(wf);
end;

界面與事件代碼

  • MediaPlayer1.Visible := False (隱藏自帶控制面板)
  • BtStart:「開始錄音」,BtStop:「停止錄音」 (初始 Enabled=False)
procedure TForm1.BtStartClick(Sender: TObject);
const FileName = 'Temp.wav'; // 當前目錄
begin
  try
    CreateWav(1, 8, 11025, ExtractFilePath(Application.ExeName) + FileName); // 8bit/11kHz/單聲道
    MediaPlayer1.DeviceType := dtAutoSelect;
    MediaPlayer1.FileName := ExtractFilePath(Application.ExeName) + FileName;
    MediaPlayer1.Open;
    MediaPlayer1.StartRecording; // 開始錄製
    BtStart.Enabled := False; BtStop.Enabled := True;
  except
    BtStart.Enabled := True; BtStop.Enabled := False;
    Application.MessageBox('媒體設備初始化失敗!', '錯誤', MB_ICONERROR + MB_OK);
  end;
end;

procedure TForm1.BtStopClick(Sender: TObject);
begin
  try
    MediaPlayer1.Stop;
    MediaPlayer1.Save;   // 關鍵:將內存數據刷新到文件,並更新頭部長度字段
    MediaPlayer1.Close;
    Application.MessageBox('聲音錄制完畢!', '信息', MB_ICONINFORMATION + MB_OK);
    BtStart.Enabled := True; BtStop.Enabled := False;
  except
    Application.MessageBox('保存聲音文件出錯!', '錯誤', MB_ICONERROR + MB_OK);
    BtStart.Enabled := True; BtStop.Enabled := False;
  end;
end;

參數選擇指南

參數值說明
Channels1 / 2單聲道/立體聲。單聲道文件體積減半。
Resolution8 / 16位深。8 位動態範圍小,16 位接近 CD 質量。
Rate11025 / 22050 / 44100採樣率。越高保真度越好,文件越大。語音 11025 足夠。

示例:CreateWav(1, 8, 11025, 'C:\abc.wav') → 約 11 KB/秒;CreateWav(2, 16, 44100, 'C:\abc.wav') → 約 172 KB/秒 (CD 質量)。

常見問題與補充

  1. 播放音量小:錄製文件播放時需在系統音量控制中調高「Wave」/「WAV」項。
  2. 生成 0 字節文件 + .tmp 文件:極少數聲卡驅動會將數據寫入臨時 .tmp 文件。重命名 .tmp 為 .wav 即可。
  3. 混錄系統聲音:啟用「立體聲混音」/「What U Hear」錄音源,可錄制播放器、網頁聲音(如文中提到的 NetBus 監聽原理)。
  4. 高級格式:MP3/OGG/ACM 需調用 ACM (Audio Compression Manager) 或第三方編碼器(如 LAME),不在 MediaPlayer 能力範圍內。

總結

僅用 TMediaPlayer 和幾十行代碼即可實現功能完整的錄音機,展示了 Delphi 封裝 Windows 多媒體 API 的強大威力。理解 WAV 文件頭結構,是進行音頻處理開發的基礎。

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