Record Output Audio via Terminal
2 minute reading time
This post is specific to
PulseAudio on Linux.
I know of GUI based solutions like PulseAudio Volume Control that lets you set up monitor devices. But, what if you want to do this through the terminal?
Luckily, b-ak on AskUbuntu gave an elegant answer to this question!
First make sure you have
sudo apt install pulseaudio-utils
Next we need to search for the speaker we wish to monitor
pacmd list-sinks | grep -e 'name:' \ -e 'index' \ -e 'Speakers'
It will output something similar to this:
* index: 0 name: <alsa_output.pci-0000_00_1b.0.analog-stereo> analog-output-speaker: Speakers (priority 10000, latency offset 0 usec, available: unknown)
From here note the name in
<> of the speaker you wish to monitor. For example for my output above, I wish to monitor
Next we will use the
parec command to record the raw audio stream from the PulseAudio server.
parec --device alsa_output.pci-0000_00_1b.0.analog-stereo.monitor | encoder_command
Notice the addition of
.monitor at the end of the device.
encoder_command, b-ak used
lame -r -V0 - out.mp3
This command takes in a raw pcm
-r and enables variable bit rates for the highest quality
-V0. From there it encodes it and puts it in
lame actually makes a couple assumptions about your raw pcm if you didn’t specify additional arguments:
- The Raw PCM is formatted in signed 16-bit little endian samples
- The Raw PCM has 2 channels
If you’re assumptions don’t meet the above, then you will need to add additional arguments.
We can replace
lame with the more featureful
ffmpeg if we take note of the same assumptions above.
ffmpeg -f s16le \ -ac 2 \ -i pipe:0 \ -b:a 0 \ out.mp3
Where we can replace the
.mp3 with whatever file extension
Now to show the entire command
parec --device alsa_output.pci-0000_00_1b.0.analog-stereo.monitor | \ ffmpeg -f s16le \ -ac 2 \ -i pipe:0 \ -b:a 0 \ out.mp3