对声卡输出进行录音的设置.

本文介绍了如何对声卡的Line Out进行录音,特别是针对即时聊天中录取对方语音的需求。重点讨论了Stereo Mix和Mono Mix的区别,并指出在编程打开录音设备时无法直接选择通道,需要通过Mixer API预先设置。由于不同设备的输出源定义不一,代码逻辑可能不完美,可能需要多次尝试以找到正确的输出源。同时建议在录音前禁用所有输入源以保证录音质量,并调整其他输出源音量至最小。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一般正常的录音都是对Line in进行录音,但有些需要对line out进行录音,因为有些音源是没有line in的.

如即时聊天时录取对方的语音.但这些声音都要经过声卡播放,所以它们的音源就是声卡输出.

对于声卡的输出,在录音控制中有两个,就是Mono mix和stereo mix,当然最好是选取 stereo mix,效果更好.

编程打开录音设备时,是不能控制打开的设备上的输出还是输入通道的.所在要在打开设备前就设置好.

用Mixer的API可以对输出源进行牧举,不过不同的设备的定义不同,对于SoundMax能够正确区别stereo mix和Mono mix的区别,但AC 97的声卡它都是相似的输出源.所以只能多次地优选列举.代码逻辑不是完美,但只能如此.否则只能让用户手工选择,致少要按6次mouse才行.

以下是自己定义的结构,在第一次没有找到正确的输出源时将所有输出源保的index,swLineID和name保存起来.下面

在结构数组中再优选,而不要再对设备牧举

typedef struct ControlEnumData{
 INT index;
 CString szName;
 DWORD dwLineID;
}  CTRL_ENUM_DATA,* LPCTRL_ENUM_DATA;

 

 

BOOL   XXX::setOutSource()

   UINT deviceCount 
=  ::mixerGetNumDevs();
    
if (deviceCount  <   1 ){
        MessageBox(
" 没有找到混音设备,请手工选择录音设备的混音输出! " );
        
return  TRUE;
    }
    BOOL found 
=  FALSE;

    
for (UINT devID  =   0 ;devID  <  deviceCount; devID ++ ){
        HMIXER hMixer;
        
if  (mixerOpen( & hMixer, devID, (DWORD) 0 0 , CALLBACK_WINDOW)  !=  MMSYSERR_NOERROR)
        {
        ::mixerClose(hMixer);
            
continue ;
        }

        MIXERLINE line;
        line.cbStruct 
=   sizeof (MIXERLINE);
        
// 注意我们要查找的是录音设备.所以dwComponentType 应该是 MIXERLINE_COMPONENTTYPE_DST_WAVEIN;
        line.dwComponentType  =  MIXERLINE_COMPONENTTYPE_DST_WAVEIN;
        
if (::mixerGetLineInfo((HMIXEROBJ)hMixer, & line,
            MIXER_OBJECTF_HMIXER
| MIXER_GETLINEINFOF_COMPONENTTYPE)  !=  MMSYSERR_NOERROR){
        ::mixerClose(hMixer);
            
continue ;
        }
        DWORD dwConnections 
=  line.cConnections;
        DWORD selectIndex 
=   - 1 ;
        MIXERLINE linesub;
        CTRL_ENUM_DATA enumData[
8 ];
        
int  enumIndex  =   0 ;
        
// 然后看录音设备上共一连结了几个线路
         for (DWORD i  =   0 ;i <  dwConnections ;i ++ ){     // 列举出波形混音输出源的索引并最声音设置最大
            linesub.cbStruct  =   sizeof (MIXERLINE);   
            linesub.dwSource   
=    i;   
            linesub.dwDestination 
=  line.dwDestination;
            
if<
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值