使用TMediaPlayer记录和保存.wav文件(Delphi 2010)

时间:2010-07-05 09:02:06

标签: delphi audio delphi-2010 media record

对于德尔福世界来说,这真的很新。

现在我正在使用TMediaPlayer录制一些声音并保存。 我为TMediaPlayer中的记录按钮发出了一个click事件,该按钮执行SaveFileDialog。用户应输入他想要保存的文件名,然后在录制.wav文件后,他可以点击停止按钮,它将保存他录制的.wav文件。

实际上它没有事件创建文件。

我将展示我的delphi代码的一些重要代码部分

if Button = TMPBtnType.btRecord then
begin
SaveDialogSpeichern.Execute;
MediaPlayerSound.FileName := SaveDialogSpeichern.FileName;
MediaPlayerSound.StartRecording;

end

和保存的那些:

  MediaPlayerSound.Stop;
  MediaPlayerSound.Save;

我无法使用bass.dll,所以如果有可能的话,我想用TMediaPlayer做这个

3 个答案:

答案 0 :(得分:2)

我找到了解决问题的方法。 似乎TMediaPlayer不支持创建声音文件或录制声音文件。

有一种方法可以使用WinApi(使用mmSystem;)

我使用了这段代码:

    mciSendString(PChar('OPEN NEW TYPE WAVEAUDIO ALIAS mysound'), nil, 0,
    Handle);
 mciSendString(PChar('SET mysound TIME FORMAT MS ' +     
   'BITSPERSAMPLE 8 ' +                
   'CHANNELS 1 ' +                     
   'SAMPLESPERSEC 8000 ' +             
   'BYTESPERSEC 8000'),                
   nil, 0, Handle);
 mciSendString(PChar('RECORD mysound'), nil, 0, Handle);
mciSendString(PChar('SAVE mysound "' + SaveDialogSpeichern.FileName+'"' ), nil, 0,
    Handle);
mciSendString(PChar('CLOSE mysound'), nil, 0, Handle) 

希望这可以帮助任何有同样问题的人

答案 1 :(得分:2)

而且我想加上这个;您可以使用这种方式开始停止并保存记录

procedure TForm1.Button1Click(Sender: TObject);     // Record
begin
  mciSendString('OPEN NEW TYPE WAVEAUDIO ALIAS mysound', nil, 0, Handle);
  mciSendString('SET mysound TIME FORMAT MS ' +     // set time
    'BITSPERSAMPLE 8 ' +                // 8 Bit
    'CHANNELS 1 ' +                     // MONO
    'SAMPLESPERSEC 8192 ' +             // 8 KHz
    'BYTESPERSEC 8192',                // 8000 Bytes/s
    nil, 0, Handle);
  mciSendString('RECORD mysound', nil, 0, Handle);
end;


procedure TForm1.Button2Click(Sender: TObject);     // Stop
begin
  mciSendString('STOP mysound', nil, 0, Handle)
end;


procedure TForm1.Button3Click(Sender: TObject);      // Save

begin
mciSendString(PChar('SAVE mysound "' + '/test.wav'+'"' ), nil, 0,
    Handle);
  mciSendString('CLOSE mysound', nil, 0, Handle)
end;

答案 2 :(得分:-1)

我已经使用TMediaPlayer解决了您的问题:要进行记录,您必须添加“ open”命令,如下所示:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    this->SaveDialog1->Execute();
    this->MediaPlayer1->FileName = this->SaveDialog1->FileName;
    this->MediaPlayer1->Open();
    this->MediaPlayer1->StartRecording();
}

警告:TMediaPlayer不支持创建声音文件(如您所说),因此在使用它之前,您必须手动编写一个新文件(很奇怪)。

您可以手动执行此操作(只需在某个地方创建一个新的.wav)或使用以下代码:(如果您不想在现有文件上进行记录,我建议您使用此代码:)

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    this->SaveDialog1->Execute();
    this->MediaPlayer1->FileName = this->SaveDialog1->FileName;

    TMemoryStream *AudioFile;
    AudioFile = new TMemoryStream();
    char buffer[43]= 0x52,0x49,0x46,0x46,0x04,0xc0,0x50,0x00,0x57,0x41,0x56,0x45,0x66,0x6D,0x74,0x20,
    0x10,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x44,0xAC,0x00,0x00,0x88,0x58,0x01,0x00,
    0x02,0x00,0x10,0x00,0x64,0x61,0x74,0x61,0xE0,0xBF,0x50}; // .wav header example
    AudioFile->Write(buffer,43);
    char byte=0;
    for (int i = 0; i < 49120; i++) // some free audiodata
    {
        AudioFile->Write(&byte,1);
    }
    AudioFile->SaveToFile(this->SaveDialog1->FileName);
    AudioFile->Clear();
    delete AudioFile;
    AudioFile=NULL;

    this->MediaPlayer1->Open();
    this->MediaPlayer1->StartRecording();

}

//停止按钮:

void __fastcall TForm1::Button2Click(TObject *Sender)
{
    this->MediaPlayer1->Stop();
}

//保存按钮:

void __fastcall TForm1::Button3Click(TObject *Sender)
{
    this->MediaPlayer1->Save();
    this->MediaPlayer1->Close();
}