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

Eso*_*tes 9 pulseaudio

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

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

我该怎么做?我将不胜感激!

我的部分问题已在此处得到解答:How to Pass/Record audio output as an input device? (但它只允许将输出流设置为输入,而不与真实麦克风重叠)

use*_*.dz 9

  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
    
    Run Code Online (Sandbox Code Playgroud)
  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
    
    Run Code Online (Sandbox Code Playgroud)
  3. 回送麦克风 Virtual1

    pactl load-module module-loopback latency_msec=1 sink=Virtual1
    
    Run Code Online (Sandbox Code Playgroud)
  4. 环回Virtual2.monitorVirtual1

    pactl load-module module-loopback latency_msec=1 sink=Virtual1 source=Virtual2.monitor
    
    Run Code Online (Sandbox Code Playgroud)
  5. 环回Virtual2.monitor模拟立体声(就我而言)

    pactl load-module module-loopback latency_msec=1 sink=1 source=Virtual2.monitor
    
    Run Code Online (Sandbox Code Playgroud)
  6. 然后打开pavucontrol

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

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

      pactl set-default-sink 1
      
      Run Code Online (Sandbox Code Playgroud)
    • 录音:从Virtual1.monitorCLI 或使用 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
      
      Run Code Online (Sandbox Code Playgroud)
    • 播放:将音乐播放器设置为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       
      
      Run Code Online (Sandbox Code Playgroud)

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

            Microphone      ---
                               \                   
            Virtual1.mon    ------  Virtual1    >   Skype
                               /  
    VLC   > Virtual2.mon    ------  Virtual2
                               \
    Skype > AnalogSt.mon    ------  AnalogSt    >   Headset
Run Code Online (Sandbox Code Playgroud)

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

笔记:

  • 我使用过 sink id(例如:1),但如果你想制作一个脚本,最好使用名称。(我在这里避免这样做,因为它们很长)。

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

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

    正如我已经测试过的,延迟接近半秒到一秒。

  • 我认为有时很难弄清楚 Jack 工具会发生什么。图形地图会很清楚:

在此处输入图片说明