应用TMediaplayer如何实现录制wav音频文件?(高分)

zl198183 2007-10-10 08:17:48
如题,应用TMediaplayer如何实现录制wav音频文件。已经实现媒体播放功能,就是不知道录音怎么做,各位大大帮忙啊,我把所有的分都送上
...全文
277 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
蒋晟 2007-10-11
  • 打赏
  • 举报
回复
Mediaplayer没有录音功能。
i_love_pc 2007-10-11
  • 打赏
  • 举报
回复
[转]老妖的代码:
用MediaPlay录音   
//---------------------------------------------------------------------------
void __fastcall CreateWav(WORD wChannels, WORD wResolution, long lRate, String strFileName)
{
typedef struct _TWavHeader
{
long rId;
long rLen;
long wId;
long fId;
long fLen;
WORD wFormatTag;
WORD nChannels;
long nSamplesPerSec;
long nAvgBytesPerSec;
WORD nBlockAlign;
WORD wBitsPerSample;
long dId;
long wSampleLength;
}TWavHeader;

TWavHeader wh;
wh.rId = 0x46464952;
wh.rLen = 36;
wh.wId = 0x45564157;
wh.fId = 0x20746d66;
wh.fLen = 16;
wh.wFormatTag = 1;
wh.nChannels = wChannels;
wh.nSamplesPerSec = lRate;
wh.nAvgBytesPerSec = wChannels * lRate * (wResolution / 8);
wh.nBlockAlign = wChannels * (wResolution / 8);
wh.wBitsPerSample = wResolution;
wh.dId = 0x61746164;
wh.wSampleLength = 0;
int nHandle = FileCreate(strFileName);
FileSeek(nHandle, 0, 0);
FileWrite(nHandle, &wh, sizeof(wh));
FileClose(nHandle);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnStartClick(TObject *Sender)
{
// 开始录音
MediaPlayer1->DeviceType = dtAutoSelect;
CreateWav(2, 16, 44100, "C:\\Test.wav");
MediaPlayer1->FileName = "C:\\Test.wav";
MediaPlayer1->Open();
MediaPlayer1->StartRecording();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnEndClick(TObject *Sender)
{
// 结束录音
MediaPlayer1->Stop();
MediaPlayer1->Save();
MediaPlayer1->Close();
}
//---------------------------------------------------------------------------
i_love_pc 2007-10-11
  • 打赏
  • 举报
回复
[转]:
创建一个Application,然后在包含多媒体系统头文件: 
#include <mmsystem.h>

在表单上添加两个按钮,然后在OnClick事件的响应函数中添加如下代码:
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
//自动开始录制Wave格式的数据
{
mciSendString("close p1",0,0,0);
mciSendStringA("open new type WAVEAudio alias p1",0,0,0);
mciSendString("record p1",0,0,0);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
//停止录音,并将Wave数据存储到当前目录下的001.wav中
{
mciSendString("stop p1",0,0,0);
mciSendString("save p1 001.wav",0,0,0);
mciSendString("close p1",0,0,0);
}
//---------------------------------------------------------------------------

然后就是编译执行了! ^_^
ydlchina 2007-10-11
  • 打赏
  • 举报
回复
换别的吧
jacknes009 2007-10-11
  • 打赏
  • 举报
回复
也可以用
BCB里用MCI实现简单的录音功能(摘录自BCB Demo)

代码相当简单:

HANDLE m_hMCIWnd=MCIWndCreate(Handle,
HInstance,
WS_CHILD | WS_OVERLAPPED | WS_CAPTION | WS_BORDER |
MCIWNDF_RECORD | MCIWNDF_SHOWALL,
NULL );

MCIWndNew(m_hMCIWnd, "waveaudio");

MCI_WAVE_SET_PARMS set_parms;

set_parms.wFormatTag = WAVE_FORMAT_PCM;
set_parms.wBitsPerSample = 16;
set_parms.nChannels = 1;
set_parms.nBlockAlign = (set_parms.nChannels*set_parms.wBitsPerSample)/8;
set_parms.nSamplesPerSec = 44100;
set_parms.nAvgBytesPerSec = ((set_parms.wBitsPerSample) *
set_parms.nChannels *
set_parms.nSamplesPerSec)/8;

// now send the format changes with MCI_SET
int deviceID=MCIWndGetDeviceID(m_hMCIWnd);
int result = mciSendCommand( deviceID, MCI_SET,
MCI_WAIT
| MCI_WAVE_SET_FORMATTAG
| MCI_WAVE_SET_BITSPERSAMPLE
| MCI_WAVE_SET_CHANNELS
| MCI_WAVE_SET_SAMPLESPERSEC
| MCI_WAVE_SET_AVGBYTESPERSEC
| MCI_WAVE_SET_BLOCKALIGN,
(DWORD)(LPVOID)&set_parms);

MCIWndRecord(m_hMCIWnd); //开始录制

ShowMessage("录音中...");

MCIWndStop(m_hMCIWnd); //录制完毕
MCIWndSave(m_hMCIWnd,L"abc.wav"); //保存
MCIWndClose(m_hMCIWnd);

MCIWndDestroy(m_hMCIWnd);

头文件:#include <vfw.h>

jacknes009 2007-10-11
  • 打赏
  • 举报
回复
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::recordClick(TObject *Sender)
{
String filename;
filename = ExtractFileDir(Application->ExeName);
if(FileExists(filename+"\\Record.wav"))
{
DeleteFile(filename+"\\Record.wav");
}
CreateWav(filename+"\\Record.wav");

MediaPlayer1->Close();
MediaPlayer1->DeviceType = dtAutoSelect;
MediaPlayer1->FileName = filename+"\\Record.wav";
MediaPlayer1->Open();
MediaPlayer1->StartRecording();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::SaveClick(TObject *Sender)
{
MediaPlayer1->Save();
MediaPlayer1->Close();
}
//---------------------------------------------------------------------------

CreateWav()函数

unit Unit2;

interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,OleServer, SpeechLib_TLB,ComCtrls, StdCtrls, Buttons;
type
TWavHeader = record //定义一个Wav文件头格式
rId : longint;
rLen : longint;
wId : longint;
fId : longint;
fLen : longint;
wFormatTag : word;
nChannels : word;
nSamplesPerSec : longint;
nAvgBytesPerSec : longint;
nBlockAlign : word;
wBitsPerSample : word;
dId : longint;
wSampleLength : longint;
end;


procedure CreateWav(fn:string { 对应的文件名称 } );




implementation

procedure CreateWav(fn:string { 对应的文件名称 } );
var
wf : file of TWavHeader;
wh : TWavHeader;
channels,rate,resolution:word;

begin
channels:=2;
rate:=44100;
resolution:=16;

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;

assignfile(wf,fn); {打开对应文件 }
rewrite(wf); {移动指针到文件头}
write(wf,wh); {写进文件头 }
closefile(wf); {关闭文件 }
end;

end.
zl198183 2007-10-11
  • 打赏
  • 举报
回复
楼上,为什么我运行的时候总是出现错误“NO MCI device Open”?
能不能帮忙解决一下,另有分送

604

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder VCL组件使用和开发
社区管理员
  • VCL组件使用和开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧