delphi - 录制扬声器或立体声混音的声音

标签 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)) <> 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;

它只录制麦克风,我可以同时录制扬声器和麦克风吗?还是分开?

最佳答案

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

如果您仍在使用 Windows XP,您可能可以使用“软件混合”或“立体声输出”重新编码 channel 。

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

造成这种情况的主要原因是录制整个声卡输出的能力使音频文件的任何数字版权保护无效。

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

我认为您也许可以使用低音声音库( http://www.un4seen.com/ )来实现这一目标,但我不确定。

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

编辑:在查看名为 Audacity 的程序后,我发现只有当您选择 WASAPI 作为声音接口(interface)时,计算机声音输出的录制才有效。

进一步了解 WASAPI,这似乎是 Windows Vista 中引入的新音频接口(interface)。现在我必须承认我以前不知道这一点。

所以看来答案在于使用 WASAPI 而不是旧的 MME 音频接口(interface)。

Google 上的快速搜索确实表明有些人已经设法使用 Delphi 的 WASAPI。

现在,由于我对这个新的声音 API 没有任何经验,所以恐怕我无法比建议您了解 WASAPI 并找到一些示例来为您提供更多帮助。

编辑2:设法找到一个在Delphi中使用WASAPI接口(interface)进行环回录制的小示例。您可以在这里获取:

http://4coder.org/delphi-source-code/547/

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

http://www.delphipraxis.net/183977-wasapi-loopback-audio-capturing.html

关于delphi - 录制扬声器或立体声混音的声音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34040172/

相关文章:

android - 如何更改 Delphi 中 TCalendar 组件的单元格颜色?

delphi - 如何将重载类方法分配给匿名方法?

sql-server - 区域日期格式和数据库日期格式的不同日期格式的 SQL Server 错误

Delphi 如何更快地搜索二进制文件?

delphi - Delphi 相当于向集合添加元素的 "+="是什么?

delphi - 如何将 vcl 样式应用到 TPopupmenu?

delphi - TObject 和 NIL Delphi 中的析构函数类

delphi - 使用delphi检测USB驱动器/设备

multithreading - Delphi 7 的线程框架 - 有吗?

Delphi - 使用 FormatFloat ('0.##' 时浮点舍入不一致,argValue)