Audio aufnehmen und gleichzeitig mithören

  • Mit einem usb-Audio device kann ich über den Mikrofon Eingang in ein MP3 aufnehmen :

    Code
    1. AUDIODEV=dsnooped rec -c 1 -q /media/usbstick/recording/soxrecording.mp3

    Jetzt möchte ich während die Aufnahme läuft auch mithören, was ich gerade aufnehme


    Dazu leite ich den Mikrofon Eingang auf den Ausgang um wie folgt:

    Code
    1. arecord -D dsnooped -f S16_LE -c 1 -r 192000 -d 2000000 | aplay -D dsnooped

    leider bekomme ich die Fehlermeldung:


    Code
    1. arecord: main:788: audio open error: Device or resource busy



    die /etc/asound.conf sieht so aus:


    Code
    1. pcm.dsnooped {
    2. type dsnoop
    3. ipc_key 234884
    4. slave { pcm "hw:1" channels 2
    5. }



    Meine Frage lautet:


    wie kann man während der Aufnahme in eine Datei gleichzeitig den Kanal mithören ?

    Kann man sich vielleicht einen virtuellen Kanal erstellen ?

  • Du könntest einerseits tee verwenden, um die Ausgabe von arecord sowohl in eine Datei zu schreiben als auch an der Standardausgabe auszugeben. Dann sollte es komplett ohne dsnoop funktionieren, ungefähr so

    Code
    1. arecord -D plughw:1 -f S16_LE -c 1 -r 192000 - | tee aufnahme.wav | aplay

    und Pulseaudio wäre auch eine Möglichkeit, das bietet von Haus die Möglichkeit mit mehreren Programmen aufzunehmen und wiederzugeben und es gibt auch so etwas wie eine eigene virtuelle Soundkarte zum Mithören von Aufnahmen.


    dsnoop sollte aber natürlich auch funktionieren. Ich habe es hier gerade ohne eigene asound.conf ausprobiert und hier hat es auf diese Art auf Anhieb geklappt (mit zu meiner Soundkarte passenden Optionen):

    Code
    1. $ arecord -D dsnoop:1,0 -f S32_LE -c 2 -r 48000 | aplay
    2. $ export AUDIODEV="dsnoop:1,0"
    3. $ rec -b 32 -r 48000 -c 2 -q recording.wav

    Was mir bei dir aufgefallen ist, ist dass du mit aplay auch an dsnooped wiedergibst, aber dsnoop ist ja ein Plugin, das nur der Aufnahme dient. Kommt mir falsch vor, aber es ist wahrscheinlich nicht die eigentliche Fehlerursacher, denn der Fehler kommt ja schon von arecord.

    Was bei deiner asound.conf schief läuft, müsste ich mir erst noch ansehen, wenn du es so machen willst.

  • Danke für die schnelle Antwort,


    was ich vergaß zu erwähnen ist dass ich .mp3 aufnehmen will, deshalb benutze ich sox. Das funktioniert gut.


    arecord in Verbindung mit lame zum mp3 wandeln war zu prozessorlastig und hat ständig Knackgeräusche verursacht.


    Ich denke auch die Lösung ist die asound.conf richtig zu gestalten.

  • Also bei meinem letzten Beispiel kannst du auch direkt in mp3 aufnehmen – ich habe nur wav verwendet, weil mir das Paket für die Unterstützung des mp3-Formats von sox fehlt. Hier also noch einmal ohne, dass eine asound.conf notwendig wäre und mit dem Befehl alsaloop, der arecord | aplay ersetzt:

    Code
    1. $ alsaloop -C plug:dsnoop:1 -P plughw:1
    2. $ AUDIODEV=dsnoop:1 rec -b 16 -r 48000 -c 2 -q recording.mp3

    Alternativ kannst du natürlich auch so etwas machen (ich habe aber nicht ausprobiert wie gut es funktioniert - ich könnte mir vorstellen, dass es da wieder zu kleineren Knacksern kommt)

    Code
    1. $ export AUDIODEV=plughw:1
    2. $ rec -c 1 -q -t mp3 /dev/stdout | tee aufnahme.mp3 | play -q -t mp3 /dev/stdin


    Aber auch mit deiner asound.conf habe ich das Problem nicht nachstellen können – auf meinem Raspberry Pi 3 läuft es mit einer USB-Soundkarte problemlos. Ich habe nur ein paar Kleinigkeiten anzumerken

    • Kanalzahl
      in "dsnooped" legst du die Kanalzahl mit 2 fest, aber in arecord und sox nimmst du mit einem Kanal auf. Zumindest bei arecord brauchst du dann ein "plug", das die Zahl der Kanäle umrechnet. Du kannst das plug in die asound.conf einbauen oder einfach statt "dsnooped" als Aufnahmegerät "plug:dsnooped" angeben.
    • Wiedergabegerät
      Ich habe es schon geschrieben, aber dsnooped eignet sich nur zur Aufnahme und nicht zur Wiedergabe. Du musst bei aplay ein geeignetes Wiedergabegerät angeben und höchstwahrscheinlich auch mit plug dafür sorgen, dass in ein mit Treiber/Soundkarte kompatibles Audioformat umgerechnet wird, zum Beispiel aplay -D plughw:1, wenn die Wiedergabe über die USB-Soundkarte laufen soll.
    • Ich nehme an es ist nur ein Copy+Paste Fehler, aber bei deiner asound.conf fehlt eine schließende geschweifte Klammer } und die Zeilenumbrüche sehen so aus als wären sie durcheinander gekommen:
    Code
    1. pcm.dsnooped {
    2. type dsnoop
    3. ipc_key 234884
    4. slave {
    5. pcm "hw:1"
    6. channels 2
    7. }
    8. }
  • Super danke, hat funtioniert


    bei


    Code
    1. alsaloop -C plug:dsnoop:1 -P plughw:1

    bekam ich nach kurzer Zeit immer einen Fehler "Buffer underrun"

    mit

    Code
    1. alsaloop -C plug:dsnoop:1 -P plughw:1 -t 500000


    geht es aber jetzt.

    Und du hattest natürlich Recht "dsnooped" für die Wiedergabe habe ich rausgenommen

    Und die /etc/asound.conf brauch ich ja dann nicht mehr da dsnoop ge-inlined werden kann

    Perfekt