Share an audio playback stream through a live audio (video) conversation like Skype
In conversations using Skype, I often want to share sound output (e.g. of a Youtube video) with other people I am talking with.
So I am looking for a way to route the output to the recording input (So that the other members hear the sound output), but I can still hear the output myself. Furthermore I want still be able to speak with them while sharing the sound output with them.
How would I do that? I would be very thankful!
Part of my question has been answered here: How to Pass/Record audio output as an input device? (but it only allows for setting the output stream as input, without overlapping the real microphone)
-
Check id's
$ 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
-
Make 2 virtual sinks, (
Virtual1
mic+music,Virtual2
music)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
-
Loopback mic to
Virtual1
pactl load-module module-loopback latency_msec=1 sink=Virtual1
-
Loopback
Virtual2.monitor
toVirtual1
pactl load-module module-loopback latency_msec=1 sink=Virtual1 source=Virtual2.monitor
-
Loopback
Virtual2.monitor
to Analog Stereo (In my case)pactl load-module module-loopback latency_msec=1 sink=1 source=Virtual2.monitor
-
Then open
pavucontrol
:-
Input Device: set fallback to
Virtual1.monitor
or using CLI:pactl set-default-source Virtual1.monitor
-
Output Devices: set default to Analog Stereo (In my case) or using CLI:
pactl set-default-sink 1
-
Recording: confirm Skype from
Virtual1.monitor
or using CLI (I remove some lines from results,avconv
as example):$ 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
-
Playback: set music player to
Virtual2
(2nd null device), and confirm Skype in Analog Stereo. or through CLI (chromium
as example, see previouspactl 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
-
Simple Diagram (/
,\
loopbacks from left to right):
Microphone ---
\
Virtual1.mon ------ Virtual1 > Skype
/
VLC > Virtual2.mon ------ Virtual2
\
Skype > AnalogSt.mon ------ AnalogSt > Headset
To switch back (normal use), see Pulseaudio loopback unload audio output devices
-
Check module id:
pactl list short modules
-
Unload single module (or one by one)
pactl unload-module id
-
Or (reload with default modules):
pulseaudio -k
Notes:
I have use sink
id
(Eg: 1) but if you want make a script it's better to use names. (I avoided that here because they are long).How do I switch to another audio output sink in XFCE? contains nice script to get stream
id
from name to be used withmove-sink-input
andmove-source-output
.-
I have used
latency_msec=1
which may lead to high CPU usage. In audio conversation, you may not care about delay between music and microphone. You can remove it or increase it. But for recording mix, You may look for very small delay between music & microphone.As I have tested it, the delay is near half to one second.
I think some times its hard to figure out what going on like with Jack tools. It will be clear with graphic map: