Home > bash, python > Recording soundcard output

Recording soundcard output

Problem

I wanted to capture and record any audio output that comes through my soundcard. It is especially useful when, for example, you listen to a radio station that has a Flash player.

I have had this problem in my head for years when recently I came across the article “Linux: Recording soundcard output using arecord” written by Karthik. However, it seems that Karthik’s blog is abandoned :( Let’s hope he is all right.

This post will consist of two parts. In Part 1, I will sum up the results of Karthik. In Part 2, which is my own contribution to the topic, I will present some scripts that can do all the necessary changes of Part 1.

Part 1

As I mentioned, this section is based on this article and its comments.

This solution works with ALSA drivers. We will use the commands “arecord” and “amixer“, they come with ALSA.

First, create the file $HOME/.asoundrc with the following contents:

pcm.copy {
    type plug
    slave {
        pcm hw
    }
    route_policy copy
}

This specifies a PCM device called ‘copy’.

Execute the command “amixer contents“. It will display all controls applicable to the soundcard. We need the “Capture*” controls. Here is the relevant output on my machine:

numid=24,iface=MIXER,name='Capture Source'
  ; type=ENUMERATED,access=rw------,values=2,items=8
  ; Item #0 'Mic'
  ; Item #1 'CD'
  ; Item #2 'Video'
  ; Item #3 'Aux'
  ; Item #4 'Line'
  ; Item #5 'Mix'
  ; Item #6 'Mix Mono'
  ; Item #7 'Phone'
  : values=0,0
numid=25,iface=MIXER,name='Capture Switch'
  ; type=BOOLEAN,access=rw------,values=1
  : values=on
numid=26,iface=MIXER,name='Capture Volume'
  ; type=INTEGER,access=rw---R--,values=2,min=0,max=15,step=0
  : values=10,10
  | dBscale-min=0.00dB,step=1.50dB,mute=0

The value of “Capture Source” is 0, i.e. recording is done from the microphone. “Capture Switch” is on, and “Capture Volume” is 10.

Here is how to set to record from the soundcard. On my machine, the value of ‘Mix’ is 5, thus I need to execute the following command:

amixer cset numid=24,iface=MIXER,name='Capture Source' 5

If “Capture Switch” is off, turn it on:

amixer cset numid=25,iface=MIXER,name='Capture Switch' on

Finally, lower the “Capture Volume”, otherwise the recorded output will be noisy. You will have to play with this to find the value that works best for you. For me a low value, about 20%-30% of the maximum, worked fine.

amixer cset numid=26,iface=MIXER,name='Capture Volume' 3

Also, do not set your player volume too high while recording since it will introduce noise into your recording. Set it to 50%-60% or even lower.

Now you are ready to start recording. Try this:

arecord -d 10 -c 2 -f S16_LE -r 44100 -t wav -D copy foobar.wav

It will record a 10 seconds long session in WAV format. If you don’t want to specify the time limit, use the switch “-d 0″ and stop the recording with CTRL + C. You can listen back the recording with “mplayer foobar.wav” for instance.

If it works fine, you can consider to save the output in a compressed form:

arecord -d 0 -c 2 -f S16_LE -r 44100 -t wav -D copy | oggenc -o foobar.ogg -

It will encode your recording to OGG format on the fly. Notice the “-” at the end of the command oggenc, it tells oggenc to read from the standard input. The command oggenc is part of the vorbis-tools package.

If you want to use Skype for instance, don’t forget to set back the recording to your microphone!!!

Thanks to Karthik for figuring all these things out :)

Part 2

As you have seen in Part 1, there are several commands and switches that you need to keep in mind to record your soundcard’s output. To facilitate life, I’ve made some scripts that can do all this job for you.

Download:

Visit https://github.com/jabbalaci/Record-Soundcard-Output.

I copy here the contents of the README file:

Recording soundcard output
==========================

Usage:

./01-verify.py
    Verify your current settings. It is a good idea to write down
    these settings to know what to restore later.
    You can edit 03-Skype-restore-rec-to-microphone.py and specify
    these values.

./02-set-for-rec-soundcard-output.py
    Change settings for recording soundcard output.
    Default values: 'Mix', 'on', and 3. You might want to
    change these values in the source.

./04-start-rec-soundcard-output.py
    Start recording. The script will ask the name of the
    output file. If you press ENTER, the script will generate
    a unique name. By default, the output will be stored in the
    "output" folder.

./03-Skype-restore-rec-to-microphone.py
    Restore settings for recording the microphone. Edit the
    source and set those values that you wrote down at the
    beginning.

Troubleshooting

Well, it might happen that you have no ‘Capture Source’. It simply means that you had no luck :( I don’t know how to record the soundcard output in this case. Maybe this kind of recording is not supported by your soundcard? I tried this method on four Dell machines with a success rate of 50%. Two of them have no ‘Capture Source’ at all…

You can check the section “Related links” below, one article addresses a similar problem.

Related links

[ @reddit ]

About these ads
  1. g
    October 1, 2012 at 16:08 | #1

    You know that you are recording with the soundcard? This means minor quality and all noises in the room are there, too.

  2. Raphael
    July 27, 2013 at 20:20 | #2

    There is no ‘Capture Source’, but only ‘Digital Capture Volume’ and ‘Capture Volume’ and ‘Capture Switch’

  1. No trackbacks yet.
You must be logged in to post a comment.
Follow

Get every new post delivered to your Inbox.

Join 62 other followers

%d bloggers like this: