【问题标题】:Recording and saving .wav Files with TMediaPlayer (Delphi 2010)使用 TMediaPlayer 录制和保存 .wav 文件(Delphi 2010)
【发布时间】:2010-07-05 09:02:05
【问题描述】:

我对 delphi 世界真的很陌生。

现在我正在使用 TMediaPlayer 录制一些声音并保存。 我为执行 SaveFileDialog 的 TMediaPlayer 中的记录按钮创建了一个单击事件。用户应该输入一些他想保存的文件名,然后在录制 .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 来做这个

【问题讨论】:

    标签: delphi audio delphi-2010 media record


    【解决方案1】:

    我找到了解决问题的方法。 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) 
    

    希望对遇到同样问题的人有所帮助

    【讨论】:

      【解决方案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;
      

      【讨论】:

        【解决方案3】:

        我已经用 TMediaPlayer 解决了你的问题:要录制,你必须像这样添加“打开”命令:

        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();
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-04-17
          • 2014-07-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-11-13
          相关资源
          最近更新 更多