Delphi 从扬声器或立体声混音器录制声音

Delphi 从扬声器或立体声混音器录制声音,delphi,delphi-7,Delphi,Delphi 7,我搜索了一些示例并发现: var op: TMCI_Open_Parms; rp: TMCI_Record_Parms; sp: TMCI_SaveParms; begin // Open op.lpstrDeviceType := 'waveaudio'; op.lpstrElementName := ''; if mciSendCommand(0, MCI_OPEN, MCI_OPEN_ELEMENT or MCI_OPEN_TYPE, cardinal(@op

我搜索了一些示例并发现:

var
  op: TMCI_Open_Parms;
  rp: TMCI_Record_Parms;
  sp: TMCI_SaveParms;
begin

  // Open
  op.lpstrDeviceType := 'waveaudio';
  op.lpstrElementName := '';
  if mciSendCommand(0, MCI_OPEN, MCI_OPEN_ELEMENT or MCI_OPEN_TYPE, cardinal(@op)) <> 0 then
    raise Exception.Create('MCI error');

  try

    // Record
    rp.dwFrom := 0;
    rp.dwTo := 10000;
    rp.dwCallback := 0;
    if mciSendCommand(op.wDeviceID, MCI_RECORD, MCI_TO or MCI_WAIT, cardinal(@rp)) <> 0 then
      raise Exception.Create('MCI error. No microphone connected to the computer?');

    // Save
    sp.lpfilename := PChar(ExtractFilePath(Application.ExeName) + 'test.wav');
    if mciSendCommand(op.wDeviceID, MCI_SAVE, MCI_SAVE_FILE or MCI_WAIT, cardinal(@sp)) <> 0 then
      raise Exception.Create('MCI error');

  finally
    mciSendCommand(op.wDeviceID, MCI_CLOSE, 0, 0);
  end;
var
op:TMCI_Open_Parms;
rp:TMCI_Record_Parms;
sp:TMCI_SaveParms;
开始
//打开
op.lpstrDeviceType:=“waveaudio”;
op.lpstrElementName:='';
如果mciSendCommand(0,MCI_OPEN,MCI_OPEN_元素或MCI_OPEN_类型,基数(@op))0,则
引发异常。创建('MCI错误');
尝试
//记录
rp.dwFrom:=0;
rp.dwTo:=10000;
rp.dwCallback:=0;
如果mciSendCommand(op.wDeviceID,MCI_RECORD,MCI_TO或MCI_WAIT,cardinal(@rp))0,则
引发异常。创建('MCI错误。没有麦克风连接到计算机?');
//拯救
sp.lpfilename:=PChar(ExtractFilePath(Application.ExeName)+'test.wav');
如果mciSendCommand(op.wDeviceID,MCI_SAVE,MCI_SAVE_FILE或MCI_WAIT,cardinal(@sp))为0,则
引发异常。创建('MCI错误');
最后
mciSendCommand(op.wDeviceID,MCI_CLOSE,0,0);
结束;

它只录制麦克风,我可以同时录制扬声器和麦克风吗?或者单独使用?

执行此操作的能力很大程度上取决于您使用的Windows版本

如果您仍在使用Windows XP,则可能有“软件混合”或“立体声输出”重编码频道可用

但是,如果您使用的是Windows Vista或更高版本,这些频道将不再可用。不使用一些非官方的声卡驱动程序是不行的

其主要原因是,记录整个声卡输出的能力使音频文件的任何数字版权保护无效

因此,为了实现您所需要的功能,您必须找到一些定制的声音库,可以直接播放Youtube上的音乐,将您的麦克风与帽子混合,并将其输出(录制)到某个文件中

我认为您可能可以通过Bass sound library()实现这一点,但我不确定

另一种选择是使用电缆将
Wave Out
线路直接连接到
线路输入
端口,然后从
线路输入
录制内容,而不是从麦克风录制内容。另外,请确保允许您的麦克风声音通过扬声器播放(默认情况下,大多数声卡都会禁用此功能,以避免可能的声音回声)

编辑:查看名为Audacity的程序后,我发现只有选择WASAPI作为声音接口,才能录制计算机的声音输出

进一步了解WASAPI,这似乎是WindowsVista引入的新音频接口。现在我必须承认我以前不知道这件事

所以,答案似乎在于使用WASAPI而不是旧的MME音频接口

谷歌上的快速搜索确实表明,一些人已经设法使用德尔福的WASAPI

现在,由于我对这个新的声音API没有任何经验,恐怕我只能建议您了解WASAPI并找到一些例子

EDIT2:找到了一个在Delphi中使用WASAPI接口进行环回记录的小示例。你可以在这里找到它:

在DelphiPraxis上还发现了一个关于某人在Delphi中使用WASAPI制作一个专门用于环回记录的单元的线程,但由于我不是DelphiPraxis的成员,所以无法下载并测试它


你所说的“录制演讲者”是什么意思?当然,这是一个根本的荒谬,除非你的意思是“我想在扬声器旁边放一个麦克风,然后录制扬声器周围的房间”。也许你的意思是,你想在Windows设备驱动程序层中的音频输出流到达声卡之前劫持它,在这之后,信号当然是输出,而不是输入?我想从麦克风和pc(输入和输出)录制声音,例如:我在youtube上播放音乐+用麦克风交谈,发表评论。@WarrenP:事实上。我不确定OP提到的“记录演讲者”是否如此荒谬。在这台电脑上,Audacity recorder应用程序的输入设备被列为“扬声器(Conexant 20585 Smart Audio HD)”。@MartynA,在这种情况下,麦克风应该用作播放设备。@FreeConsulting但屏幕记录器会录制电脑声音。我的程序中没有+.dll行吗?您好,SW。我不是在争论,只是好奇:那么,为什么即使在Windows7中,Audacity也能通过“扬声器”设备录制声音(请参阅我对WarrenP的评论)?不知何故,一些屏幕录音机也会录制计算机声音(扬声器发出的声音)它们是如何做到的..我用更多信息编辑了我的答案。如果我不能在这方面提供更多帮助,我很抱歉。我已经有一段时间没有和我的一些与声音相关的项目打交道了,我很高兴我能帮上忙