通过 Skype 等实时音频(视频)对话共享音频播放流

通过 Skype 等实时音频(视频)对话共享音频播放流

在使用 Skype 进行对话时,我经常想与正在交谈的其他人分享声音输出(例如 Youtube 视频)。

因此,我正在寻找一种方法将输出路由到录音输入(以便其他成员听到声音输出),但我仍然可以听到输出。此外,我希望在与他们共享声音输出的同时仍能与他们交谈。

我该怎么做呢?我会非常感激!

我的问题的一部分已在这里得到解答:如何将音频输出作为输入设备传递/记录?(但它只允许将输出流设置为输入,而不会与真实麦克风重叠)

答案1

  1. 检查身份证

    $ pactl list short sources
    0   alsa_output.pci-0000_01_00.1.hdmi-stereo.monitor    module-alsa-card.c  s16le 2ch 44100Hz   SUSPENDED
    1   alsa_output.pci-0000_00_1b.0.analog-stereo.monitor  module-alsa-card.c  s16le 2ch 44100Hz   IDLE
    2   alsa_input.pci-0000_00_1b.0.analog-stereo   module-alsa-card.c  s16le 2ch 44100Hz   SUSPENDED
    3   combined.monitor    module-combine-sink.c   s16le 2ch 44100Hz   SUSPENDED
    
    $ pactl list short sinks
    0   alsa_output.pci-0000_01_00.1.hdmi-stereo    module-alsa-card.c  s16le 2ch 44100Hz   RUNNING
    1   alsa_output.pci-0000_00_1b.0.analog-stereo  module-alsa-card.c  s16le 2ch 48000Hz   RUNNING
    2   combined    module-combine-sink.c   s16le 2ch 44100Hz   IDLE
    
  2. 制作 2 个虚拟水槽,(Virtual1麦克风+音乐,Virtual2音乐)

    pactl load-module module-null-sink sink_name=Virtual1 sink_properties=device.description=Virtual1
    pactl load-module module-null-sink sink_name=Virtual2 sink_properties=device.description=Virtual2
    
  3. 环回麦克风Virtual1

    pactl load-module module-loopback latency_msec=1 sink=Virtual1
    
  4. Virtual2.monitor送至Virtual1

    pactl load-module module-loopback latency_msec=1 sink=Virtual1 source=Virtual2.monitor
    
  5. Virtual2.monitor回到模拟立体声(就我而言)

    pactl load-module module-loopback latency_msec=1 sink=1 source=Virtual2.monitor
    
  6. 然后打开pavucontrol

    • 输入设备:设置回退到Virtual1.monitor或使用 CLI:

      pactl set-default-source Virtual1.monitor
      
    • 输出设备:默认设置为模拟立体声(就我而言)或使用 CLI:

      pactl set-default-sink 1
      
    • 录音:从Virtual1.monitor或使用 CLI 确认 Skype(我从结果中删除了一些行,avconv作为示例):

      $ pactl list short clients
      23  protocol-native.c   chromium-browser
      24  protocol-native.c   chromium-browser
      45  protocol-native.c   pavucontrol
      237 protocol-native.c   avconv
      239 protocol-native.c   pactl
      
      $ pactl list short source-outputs
      35  0   45  protocol-native.c   float32le 1ch 25Hz
      36  1   45  protocol-native.c   float32le 1ch 25Hz
      37  2   45  protocol-native.c   float32le 1ch 25Hz
      38  3   45  protocol-native.c   float32le 1ch 25Hz
      39  4   45  protocol-native.c   float32le 1ch 25Hz
      41  0   45  protocol-native.c   float32le 1ch 25Hz
      42  1   45  protocol-native.c   float32le 1ch 25Hz
      52  1   45  protocol-native.c   float32le 1ch 25Hz
      54  1   237 protocol-native.c   s16le 2ch 48000Hz
      
      $ pactl move-source-output 54 Virtual1.monitor
      
    • 播放:将音乐播放器设置为Virtual2(第二个空设备),并确认 Skype 为模拟立体声。或通过 CLI(chromium作为示例,参见上文pactl list short clients):

      $ pactl list short sink-inputs
      17  3   24  protocol-native.c   s16le 2ch 44100Hz
      58  0   -   module-combine-sink.c   s16le 2ch 44009Hz
      59  1   -   module-combine-sink.c   s16le 2ch 44100Hz
      
      $ pactl move-sink-input 17 Virtual2       
      

简单图表(/\从左到右环回):

            Microphone      ---
                               \                   
            Virtual1.mon    ------  Virtual1    >   Skype
                               /  
    VLC   > Virtual2.mon    ------  Virtual2
                               \
    Skype > AnalogSt.mon    ------  AnalogSt    >   Headset

要切换回(正常使用),请参阅Pulseaudio 环回卸载音频输出设备

  • 检查模块 ID:

    pactl list short modules
    
  • 卸载单个模块(或逐个卸载)

    pactl unload-module id
    
  • 或者(使用默认模块重新加载):

    pulseaudio -k
    

笔记:

  • 我已经使用了接收器id(例如:1),但是如果您想编写脚本,最好使用名称。(我在这里避免这样做,因为它们很长)。

  • 如何在 XFCE 中切换到另一个音频输出接收器?包含很好的脚本,可以id从名称中获取流以便与move-sink-input和一起使用move-source-output

  • 我使用过latency_msec=1,这可能会导致 CPU 使用率过高。在音频对话中,您可能不关心音乐和麦克风之间的延迟。您可以删除或增加它。但对于录音混音,您可能会寻找音乐和麦克风之间非常小的延迟。

    据我测试,延迟接近半秒到一秒。

  • 我认为有时很难弄清楚 Jack 工具是怎么回事。图形地图会很清楚:

在此处输入图片描述

相关内容