当前位置: 首页 > 编程笔记 >

delphi制作wav文件的方法

阎建德
2023-03-14
本文向大家介绍delphi制作wav文件的方法,包括了delphi制作wav文件的方法的使用技巧和注意事项,需要的朋友参考一下

本文实例讲述了delphi制作wav文件的方法。分享给大家供大家参考。具体如下:

这里delphi用waveIn...函数制作wav文件

具体代码如下:

//使用窗口接受音频设备发出的消息:
unit Unit1; 
interface 
uses 
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
 Dialogs, StdCtrls; 
type 
 TForm1 = class(TForm) 
  Button1: TButton; 
  Button2: TButton; 
  Button3: TButton; 
  procedure FormCreate(Sender: TObject); 
  procedure Button1Click(Sender: TObject); 
  procedure Button2Click(Sender: TObject); 
  procedure Button3Click(Sender: TObject); 
 protected 
  procedure WndProc(var m: TMessage); override; 
 end; 
var 
 Form1: TForm1; 
implementation 
{$R *.dfm}  
uses MMSystem; 
var 
 whIn1,whIn2, whOut: TWaveHdr; 
 hWaveIn,hWaveOut: HWAVE; 
 fmt: TWaveFormatEx; 
 buf1,buf2,SaveBuf: TBytes; 
procedure TForm1.FormCreate(Sender: TObject); 
begin 
 Button1.Caption := '开始录音'; 
 Button2.Caption := '停止录音'; 
 Button3.Caption := '播放录音'; 
end; 
//开始录音 
procedure TForm1.Button1Click(Sender: TObject); 
begin 
 {指定要录制的格式} 
 fmt.wFormatTag := WAVE_FORMAT_PCM; 
 fmt.nChannels := 2; 
 fmt.nSamplesPerSec := 22050; 
 fmt.nAvgBytesPerSec := 88200; 
 fmt.nBlockAlign := 4; 
 fmt.wBitsPerSample := 16; 
 fmt.cbSize := 0; 
 SaveBuf := nil; {清除已录制的内容} 
 if waveInOpen(@hWaveIn, WAVE_MAPPER, @fmt, Handle, 0, CALLBACK_WINDOW) = 0 then 
 begin 
  SetLength(buf1, 1024*8); 
  SetLength(buf2, 1024*8); 
  whIn1.lpData := PAnsiChar(buf1); 
  whIn1.dwBufferLength := Length(buf1); 
  whIn1.dwBytesRecorded := 0; 
  whIn1.dwUser := 0; 
  whIn1.dwFlags := 0; 
  whIn1.dwLoops := 0; 
  whIn1.lpNext := nil; 
  whIn1.reserved := 0; 
  whIn2.lpData := PAnsiChar(buf2); 
  whIn2.dwBufferLength := Length(buf2); 
  whIn2.dwBytesRecorded := 0; 
  whIn2.dwUser := 0; 
  whIn2.dwFlags := 0; 
  whIn2.dwLoops := 0; 
  whIn2.lpNext := nil; 
  whIn2.reserved := 0; 
  waveInPrepareHeader(hWaveIn, @whIn1, SizeOf(TWaveHdr)); 
  waveInPrepareHeader(hWaveIn, @whIn2, SizeOf(TWaveHdr)); 
  waveInAddBuffer(hWaveIn, @whIn1, SizeOf(TWaveHdr)); 
  waveInAddBuffer(hWaveIn, @whIn2, SizeOf(TWaveHdr)); 
  waveInStart(hWaveIn); 
 end; 
end; 
//停止录音 
procedure TForm1.Button2Click(Sender: TObject); 
begin 
 waveInStop(hWaveIn); 
 waveInUnprepareHeader(hWaveIn, @whIn1, SizeOf(TWaveHdr)); 
 waveInUnprepareHeader(hWaveIn, @whIn2, SizeOf(TWaveHdr)); 
 waveInClose(hWaveIn); 
end; 
//播放录音 
procedure TForm1.Button3Click(Sender: TObject); 
begin 
 whOut.lpData := PAnsiChar(SaveBuf); 
 whOut.dwBufferLength := Length(SaveBuf); 
 whOut.dwBytesRecorded := 0; 
 whOut.dwUser := 0; 
 whOut.dwFlags := 0; 
 whOut.dwLoops := 1; 
 whOut.lpNext := nil; 
 whOut.reserved := 0; 
 waveOutOpen(@hWaveOut, WAVE_MAPPER, @fmt, Handle, 0, CALLBACK_WINDOW); 
 waveOutPrepareHeader(hWaveOut, @whOut, SizeOf(TWaveHdr)); 
 waveOutWrite(hWaveOut, @whOut, SizeOf(TWaveHdr)); 
end; 
procedure TForm1.WndProc(var m: TMessage); 
var 
 ordLen: Integer; 
begin 
 inherited; 
 case m.Msg of 
  {处理录音消息} 
  MM_WIM_OPEN: ;   {此消息只携带了设备句柄} 
  MM_WIM_CLOSE: ;  {此消息只携带了设备句柄} 
  MM_WIM_DATA: begin {此消息携带了设备句柄和 WaveHdr 指针(LParam)}
   {保存录制的数据} 
   ordLen := Length(SaveBuf); 
   SetLength(SaveBuf, ordLen + PWaveHdr(m.LParam).dwBytesRecorded); 
   CopyMemory(Ptr(DWORD(SaveBuf)+ordLen), PWaveHdr(m.LParam).lpData, PWaveHdr(m.LParam).dwBytesRecorded); 
   {继续录制} 
   waveInAddBuffer(hWaveIn, PWaveHdr(m.LParam), SizeOf(TWaveHdr));
  end;
  {处理播放消息} 
  MM_WOM_OPEN: ;   {此消息只携带了设备句柄} 
  MM_WOM_CLOSE: ;  {此消息只携带了设备句柄} 
  MM_WOM_DONE: begin {此消息携带了设备句柄和 WaveHdr 指针(LParam)}
   waveOutUnprepareHeader(hWaveOut, PWaveHdr(m.LParam), SizeOf(TWaveHdr)); 
   waveOutClose(hWaveOut); 
  end; 
 end; 
end; 
end.

希望本文所述对大家的Delphi程序设计有所帮助。

 类似资料:
  • 本文向大家介绍java读取wav文件(波形文件)并绘制波形图的方法,包括了java读取wav文件(波形文件)并绘制波形图的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了java读取wav文件(波形文件)并绘制波形图的方法。分享给大家供大家参考。具体如下: 因为最近有不少网友询问我波形文件读写方面的问题,出于让大家更方便以及让代码能够得到更好的改进,我将这部分(波形文件的读写)代码开源

  • 问题内容: 我有一个几分钟的.wav文件,我想分割成10秒的另一个.wav文件。 到目前为止,这是我的python代码: 印刷产量: 我知道这是框架列表。我如何为该列表中的每个元素制作一个wav文件(第一个.wav文件将是?Python的模块尚不清楚如何使用框架创建.wav文件。 编辑:这是一个重复的问题,如何在python中将音频文件(wav格式)拼接为1秒拼接? 但是,如果某人的答案不需要,我

  • 问题内容: 我有一个用于音乐和语音分析的PyQt plus pyqtgraph程序,我想绘制一个wav文件的频谱(使用scipy python软件包计算)。我可以在matplotlib中做到这一点,但是由于matplotlib的性能,我需要切换到pyqtgraph,但是我找不到任何一致的方法来将scipy.signal.spectrogram的输出绘制到pyqtgraph中 谢谢! 问题答案: S

  • 基于StackExchange的代码,我编写了打开wav文件的代码。wav文件本身是一个有效的文件,因为它可以与我的Python程序正常配合使用。但是javascript函数不起作用。声音文件与我的html文件位于同一文件夹中。 任何帮助都将不胜感激。

  • 本文向大家介绍python使用wxPython打开并播放wav文件的方法,包括了python使用wxPython打开并播放wav文件的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了python使用wxPython打开并播放wav文件的方法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的Python程序设计有所帮助。

  • 问题内容: 我正在用Java 做辫子。如果倒带时间,声音会向后播放。如何向后播放WAV文件?也许有像这样的流?在Braid网站上,您可以看到我的意思。 更新: _ 解决! 看到我自己的帖子。_ 问题答案: !!!!!! 我自己解决了这个问题(14岁!!), 我写了这个课: 然后: