对于德尔福世界来说,这真的很新。
现在我正在使用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做这个
答案 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();
}