waveInOpen 如何选择是声卡 还是 麦克

作者&投稿:尔谈 (若有异议请与网页底部的电邮联系)
麦克重要还是声卡重要?~

麦克风和声卡都很重要。

麦克风主要是声音的输入采样。一款好的麦克风,对声音个频段的采样是比较均衡的,会最大程度的还原声音,不会存在某个频段的声音好一点,而另一个频段的声音差一点。

但麦克风多多少少会存在这个问题,比如使用某款麦克风会感觉高音好一点,而另一款麦克风低音又会好一点。都存在一个最佳频率范围,这就需要选择适合自己声音特点的麦克风才行了。

声卡的作用,当然是对麦克风采样的声音进行处理了,不同的声卡其偏重也是不一样的。经过声卡出来的声音也是不一样的。

最后,当然是也很重要的效果的调试了。不同的调音师调出来的效果也是完全不一样的。

首先你要能清楚你的创新声卡哪个型号的,使用的是什么驱动。


2.创新声卡安装后,需要音频设置,在设备管理器里边不能用集成声卡,音频设置KX麦克输入,安装驱动后重新启动电脑。
3.不一样的版本驱动设置的音频通道会有差异,需要对应你的MX6或MX8的DSP查看你的麦克输入端口和音频输出是哪个,在软件中相对好端口就可以使用。4.再就是你买创新声卡是会有售后服务的,如果零基础的人,最好还是联系下客服教你如何使用。创新声卡因为功能性比较强,很多玩家喜欢用它来K歌录制音频,但小白需多学习,多看看专业论坛中的教程。玩声卡不是一两天就能搞明白的,否则也不会有那么多收费的调试服务了。

事实上,声卡是PC的一种多媒体设备,所以可以用Windows 的MCI(Media Control I nterface)命令来控制声卡。MCI它提供了一组与设备无关的控制命令,是一种访问多媒体设备的高层次方法。也正因为它属于一种高层次方法,所以它提供给程序员的灵活性有限,利用MCI命令来控制声卡录音时,程序员不能在录音的过程中访问内存中的采样数据,只有在录音完成后通过访问*.WAV文件才可以得到采样数据,尽管最终还是得到了采样数据,但是这样做一方面嫌其麻烦,更重要的是存取文件需要耗费时间,声卡在采样的过程中有可能会停止下来等待文件操作,造成了采样的断续。在一些实时性要求比较高的场合(比如波形分析,实时控制等),断续的采样明显是不行的。 Windows的低级波形音频函数提供了对声卡的最大灵活性的操作,它允许在采样过程中随机地访问内存中的每个采样数据,完全可以克服使用MCI命令所遇到的实时性问题。 Windows以动态连接库Mmsystem.dll的形式提供低级波形音频函数,在Mmsystem.dll中总共包括了以下几个有关波形录入的函数:

waveInAddBuffer :向声音输入设备发送缓冲区 ;waveInClose :关闭声音输入设备
waveInGetDevCaps:获取声音输入设备性能; waveInGetErrorText:获取声音出错信息文本
waveInGetID :获取声音输入设备ID; waveInGetNumDevs:返回声音输入设备数量
waveInGetPosition :获取声音设备输入位置; waveInMessage :向声音输入设备发送信息
waveInOpen :打开声音输入设备; waveInPrepareHeader:预备声音输入缓冲区
waveInReset :停止声音输入设备工作; waveInStart :停止声音输入设备工作
waveInStop :停止声音输入; waveInUnprepareHeader : 清除预备的声音文件头

需要说明的是:不同的编程工具多会含有对这些低级波形音频函数进行说明的头文件(比如在Delphi4.0中,对Mmsystem.dll说明的文件是Mmsystem.pas),所以在不同的编程工具中调用这些函数时有可能会使用不同的名称。
与使用其他设备一样,要想用波形音频函数来控制声卡,必须要经过以下的步骤:
1. 打开波形输入设备。函数waveInOpen用于打开波形输入设备,其原型如下:
① WORD waveInOpen(lphWaveIn,wDeviceID,lpFormat,dwCallback,dwCallbackInstan ce, dwFlags) LPHWaveIn: lphWaveIn 该变量用来接收波形输入设备的句柄,该句柄应当保存下来,因为其他的波形输入函数还会用到它.
②WORD wDeviceID 该变量用来指明波形输入设备的标记号.当PC中有多块声卡(准确地说是波形输入设备)时,操作系统会为每一块声卡分配一个标记号.可以用waveInGetNumDev s函数来得到能够作为波形输入设备的数目N,则wDeviceID的取值范围为0~N-1.如果想得到没个标记号所对应的录音性能,可以使用函数waveInGetDevCaps.若把wDeviceID设为W AVE_MAPPER(即-1),则系统会自动选择一符合要求的设备(根据lpFormat的要求). ③lpFormat是一个指向PCMWAVEFORMAT数据结构的指针,应当在这个数据结构中指明所期望的采样模式,这个数据结构的定义是这样的:
Typedef structure pcmwaveformat_tag { WAVEFORMAT wf; //有关PCM格式设置的另外一种数据结构
WORD wBitsPerSample; //量化位数
}PCMWAVEFORMAT;
Typedef structure waveformat_tag {
WORD wFormatTag; //采样数据格式,目前只能用PCM格式
WORD nChannels; //通道数目(1或2)
DWORD nSamplesPerSec; //采样速率
DWORD nAvgBytesPerSec;//每秒采样得到的数据
WORD nBlockAlign; //记录区块对齐的单位。此值为nChannels*wBitsPerSample/8 }WAVEFORMAT;
④ DWORD dwCallback.定义回调函数的地址或回调窗口的句柄。回调函数的地址或回调窗口用来处理波形输入设备产生的消息。
⑤DWORD dwCallbackInstance。这是一个用户自定义的数据,该数据会一并传给回调函数(或窗口)。
⑥DWORD dwFlags。定义打开波形输入设备的标记。
CALLBACK_WINDOW 定义dwCallback为窗口句柄。
CALLBACK_FUNCTION 定义dwCallback为函数地址。
另外还可以在此指定:
WAVE_FORMAT_QUERY 只查询波形输入设备是否支持给定格式而不真的打开波形输入设备。
WAVE_ALLOWSYNC 同步方式开启波形输入设备,录音工作在后台进行。
下面一段Delphi程序说明了打开波形输入设备的过程:

type
TRecorder = class
private

FWaveFmt : TWaveFormatEx;//Delphi中,WAVEFORMAT和PCMWAVEFORMAT合为TwaveFor
matEx。
WaveHandle : HWaveIn;
WaveHdr1 : PWAVEHDR; //数据缓冲区头结构的指针 (见下文)
WaveBuffer1 : lpstr; //数据缓冲区的指针 (见下文)
procedure CallBack(uMsg,dwInstance,dwParam1,dwParam2 : DWORD); stdcall;

end;

Recorder:=TRecorder.Create;

Recorder.FWaveFmt.wFormatTag:=WAVE_FORMAT_PCM;
Recorder.FWaveFmt.wBitsPerSample:=16;
Recorder.FWaveFmt.nSamplesPerSec:=11025;
Recorder.FWaveFmt.nAvgBytesPerSec:=22050;
Recorder.FWaveFmt.nBlockAlign:=2;
WaveInOpen(@Recorder.WaveHandle,Wave_Mapper,mailto:@Recorder.FWaveFmt,
DWORD(@TRecorder.CallBack),DWORD(@Recorder),CALLBACK_FUNCTION + WAVE_ALLOW
SYNC);


2. 为采样数据分配缓冲空间

在Windows环境,可以用GlobalAllocPtr来获取一段内存空间,但是由于Windows操作系统采用了虚拟存储管理机制,这块内存空间随时有可能会被置换到硬盘上,读写硬盘所耗费的时间会造成采样的不连续。因此,在将缓冲区送往波形输入设备之前,必须调用WaveInPrepareHeader函数以保证缓冲区不会被置换到硬盘上。当然在用GlobalFreeP tr来释放缓冲区之前,必须先要用WaveInUnprepareHeader函数来解除这种保护。

下面几行Delphi语句说明了使用录音缓冲区的过程。


Recorder.WaveHdr1:=GlobalAllocPtr(GHND or GMEM_SHARE,Sizeof(WAVEHDR));
Recorder.WaveBuffer1:=GlobalAllocPtr(GHND or GMEM_SHARE,1024);
Recorder.WaveHdr1.lpData := Recorder.WaveBuffer1;
Recorder.WaveHdr1.dwBufferLength:=1024;
WaveInPrepareHeader(Recorder.WaveHandle, Recorder.WaveHdr1, sizeof(WAVEHDR
));
WaveInAddBuffer(Recorder.WaveHandle, Recorder.WaveHdr1, sizeof(WAVEHDR));

WaveInUnprepareHeader(Recorder.WaveHandle, Recorder.WaveHdr1, sizeof(TWAVE
HDR));
GlobalFreePtr(Recorder.WaveBuffer1);


但是,如果只为波形输入设备开辟一个缓冲区,则当该缓冲区被采样数据填满后,波形输入设备就无缓冲区可用,不得不停止采样,从而造成了采样的断续。所以在实际应用中,至少要为波形输入设备准备两个缓冲区,用上述方法同时送给波形输入设备。

3. 启动波形输入设备

当上述一切都准备好后,用WaveInStart启动波形输入设备,即可开始进行数据采集,在采集的过程中,一旦有缓冲区被采样数据填满,系统就回调WaveInOpen中指定的dwCa llback函数(或向指定的窗口发送消息)。在Delphi4.0中,回调函数的格式是这样的: procedure CallBack(uMsg,dwInstance,dwParam1,dwParam2 : DWORD); stdcall; 其中uMsg是Windows的消息标记号,有三种情况:

MM_WIM_OPEN 表示波形输入设备开启成功
MM_WIM_DATA 表示一个缓冲区已满。
此时dwParam1中携带有数据缓冲区头结的指针。正是通过这个指针,才可以随机地访问缓冲区中的每一个采样数据。如下面程序所示:


procedure TRecorder.CallBack(uMsg,dwInstance,dwParam1,dwParam2 : DWORD);
stdcall;
var i:Integer;
SPByte : ^Byte; //假设在打开设备时采用8位量化
SingleData : Integer;
BEGIN
case uMsg of //uMsg是Windows的消息标记号
MM_WIM_OPEN : //波形输入设备开启成功发回的消息

MM_WIM_DATA : //一个缓冲区已满发回的消息
begin
SPByte := Pointer(dwParam1);
for i :=0 to Recorder.DataLength-1 do
begin
SingleData := SPByte^; //通过SPByte来访问缓冲区中的数据

Inc(SPByte);
end;
end;
MM_WIM_CLOSE : //波形输入设备关闭成功发回的消息

end;
END;


MM_WIM_CLOSE 表示波形输入设备关闭成功。当波形输入设备关闭后,别忘了用Wave InPrepareHeader和GlobalFreePtr来释放缓冲区内存。

4. 关闭语音输入设备

waveInStop(hWaveIn) 停止语音输入
waveInReset(hWaveIn) 重置语音输入设备
waveInClose(hWaveIn) 关闭语音输入设备。其中hWaveIn是WaveInOpen得到的设备句柄。
在关闭语音输入设备前,必须重置语音输入设备,否则系统会出现这样的错误提示: "MMSYSTEM033 媒体数据仍在播放中,请重置设备或等到数据播放完毕"。但是只有当一个缓冲区填满数据后,才能重置语音输入设备
以上波形输入函数,若调用成功则返回0;否则返回非0,此时可以用waveInGetErrorText函数来得到出错信息,这样做的目的是方便调试。

三、必须注意的几点

以上阐述了作为A/D卡的声卡编程技术,但是还必须注意以下几点

1. 声卡的采样频率并不只限于11025Hz,22050Hz,44100 Hz三种,大多数声卡的采样频率在一定的范围内是可调的(当然会存在一定的偏差)。有的声卡的最高采样频率可达200K Hz(有可能随不同品牌而异)。
2. 缓冲区不能设得太小,否则也会造成采样的不连续。在作者的声卡上,若采用16为量化,22050Hz的采样速率,缓冲区设为1K字节,理论上每秒钟可以得到22050*2个字节的数据,实际上每秒钟只能得到大约16000*2个字节的数据。若缓冲区设为2K字节,则与理论值一致。
3. A/D转化后的数据格式是PCM格式,即:若是8位量化,对应着8位无符号数据,0对应着负满幅值,128对应着零电平,255对应着正满幅值;若是16位量化,对应着16位有符号数据,-32768对应着负满幅值,0对应着零电平,32767对应着正满幅值。编程过程中应注意所声明的数据类型是否与之相符合,比如在Delphi4.0中,8位无符号数据对应着 Byte型数据,16位有符号数据对应着SmallInt型数据。
4. 由于声卡的输入端往往带有隔直电容,所以不能用声卡直接对直流量进行采集。解决的办法就是将这个隔直电容短接。
5. 同样地,利用windows的API函数和声卡的D/A功能也可以使声卡产生模拟音频信号输出。


求德国人对慕尼黑奥林匹克公园的看法,请用德语原话,danke!
wie zum Beispiel das Sommer-Tollwood-Festival oder kostenlose Open-Air Konzerte im Theatron am Olympiasee. Ein Open-Air-Kino zeigt in den Sommermonaten am Olympiasee Filme. Bei Familien sehr beliebt ist das Sea-Life Center,

hadler造句 hadlerの例文 "hadler"是什麼意思
"' Jayden Hadler "'( born 23 September 1993 ) is an Austrapan petitive swimmer. In any case, Hadler said, he thought it reasonable to advise all people to open their mail gingerly. Bei jedem Regierungswechsel pe遝n sich die Hadler ihre Freiheiten und Privilegien auf dem Warningsacker zw...

求超好听的英文歌
详情请查看视频回答

请把我这短作文翻译下,谢谢了!
Bunte Vergangenheit der Erde in ein Pulver, Make-up Jade Puzzle-Welt. Werfen Sie einen Blick auf die kahlen Bäume mit Silberbarren Indus Missbrauch hing, Tannengrün Jade auf einem Treffen mit ein paar Gruppen. Ein Windstoß weht, Silberbarren, dass Kinder, Jade Gruppe Kinder, von Reben...

写出你最喜欢的三首歌
1.发如雪 周杰伦的 狼牙月伊人憔悴我举杯饮尽了风雪 是谁打翻前世柜惹尘埃是非 缘字诀几番轮回你锁眉哭红颜唤不回 纵然青史已经成灰我爱不灭 繁华如三千东流水 我只取一瓢爱了解只恋你化身的蝶 你发如雪凄美了离别我焚香感动了谁 邀明月让回忆皎洁爱在月光下完美 你发如雪纷飞了眼泪我等待苍老了谁 ...

Blue Angel (Was Bleibt, Ist Ein Kühler Morgen) 歌词
歌曲名:Blue Angel (Was Bleibt, Ist Ein Kühler Morgen)歌手:Michelle 专辑:Michelle - All The Best Sweetbox - Blue Angel Hmm, someone who wanna I woke up On the round side of bed When I yesterday is made up I'm lay for work in bed Stuck in traffic jams I spill my ...

YangLing,pleaseopenthedoor. 该怎么回答?
杨玲表示该怎么回答呀表示是一个人的想法是一个人做法是一个人的名字。

芯片uln2804简介
devices feature open-collector outputs with integral clamp diodes.The ULx2803A, ULx2803LW, ULx2823A, and ULN2823LW have series input resistors selected for operation directly with 5 V TTL or CMOS. These devices will handle numerous interface needs —particularly those beyond the ...

利川市18612348822: waveInOpen 如何选择是声卡 还是 麦克 -
印枫丁禾: 事实上,声卡是PC的一种多媒体设备,所以可以用Windows 的MCI(Media Control I nterface)命令来控制声卡.MCI它提供了一组与设备无关的控制命令,是一种访问多媒体设备的高层次方法.也正因为它属于一种高层次方法,所以它提供给程...

利川市18612348822: 在waves自带修音效果器wave tune里怎么有选择性的修音? -
印枫丁禾: 楼主您好..Waves Tune在录制的时候是会自动判断的,但是也会有判断错误的.这个是个细活儿 还是得手动的去修改.效果器里面有相应的设置 可以在播放完以后,全选,然后调一下,调整到波形原始的状态.这个你需要学习一下Waves Tune的用法可以找个说明书来看站长的Waves教材里面也有相关说明!

利川市18612348822: 如何用vc编程分别选择声卡的不同声道进行录音 -
印枫丁禾: 我想你应该可以用waveInOpen这个来实现,我对这个没有什么研究,但是你首先要知道你这个两个通道的设备id是什么才能可以用这个函数来分别录进不同的声音.我最多也只能帮到这了,其他的你要自己找资料了.原型是:MMRESULT waveInOpen( LPHWAVEIN phwi,UINT_PTR uDeviceID,LPWAVEFORMATEX pwfx,DWORD_PTR dwCallback,DWORD_PTR dwCallbackInstance,DWORD fdwOpen );

利川市18612348822: 在VC中怎么同时使用waveInOpen和waveOutOpen -
印枫丁禾: waveInOpen 就是非阻塞的,比如你设置 CALLBACK_FUNCTION,录制的时候,就会调用dwCallback 这个函数执行录制工作.也可以用一个线程来执行录制.waveOutOpen 也是非阻塞的,也可以采用一个播放线程或播放回调函数的方式执行.只要和waveInOpen 的执行函数不在同一个线程里面就行.最好都采用线程的方式,那样可以不干扰主界面线程的CPU时间,录制和播放和主调之间的同步可采用HEVENT就行了,不麻烦,使用CreateEvent,和WaitForSingleObject就行了.

利川市18612348822: 关于会声会影10无论导入视频和音频都没有声音.选择录制声音时,显示无法打开wave - in设备. -
印枫丁禾: 是不是声卡驱动 有问题 别的有声么 你是不是把 windowS media 给删了

利川市18612348822: WaveInOpen的消息怎么处理?~求救啊 -
印枫丁禾: MMRESULT waveInOpen( LPHWAVEIN phwi,UINT_PTR uDeviceID,LPWAVEFORMATEX pwfx,DWORD_PTR dwCallback,DWORD_PTR dwCallbackInstance,DWORD fdwOpen ); fdwOpen 设为CALLBACK_EVENT,则dwCallback应该设为某hEvent,则当指定设备上的录音结束时,hEvent被置为Signaled,则等待(WaitForSingleObject)此Event的线程获得CPU时间....

利川市18612348822: wave in 设备怎么打开 -
印枫丁禾: 如果显示无法打开wave-in设备,要么线路输入有问题,要么麦克插头没插到底或坏了...

利川市18612348822: 会声会影10,选择录制声音时,显示无法打开wave - in设备.快点帮帮我吧,我要比赛用的啦 -
印枫丁禾: 线路输入有问题,麦克插头没插到底或坏了.

利川市18612348822: 在YY里声卡怎么设置能有最好效果? -
印枫丁禾: 1.右键单击音量图标,选择 调整音频属性 ,将 音频 中的 声音播放 和 录音 的默认选择为 virtual cable1,然后应用确定.这时候你会发现你的电脑已经不能发出任何声音了,我们可以理解为声音被传送到虚拟通道中了. 2.打开屏幕录像专家,假...

利川市18612348822: 用会声会影录音弹出“无法打开wave - in设备”为什么???? -
印枫丁禾: 不能录画外音,确实与系统有关,我的win8就是这样,也有办法解决.录音之前先把设置里(启用5.1声道)的对勾去掉,就可以录旁白了,录完后在打上那个对勾,要不然项目播放时没声音.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网