Erstellen Sie ein virtuelles Gerät in der .asoundrc-Datei

9

Ich habe versucht, ein virtuelles Gerät zu erstellen, um das interne Audio meiner Soundkarte mit reinem ALSA aufzunehmen. Nachdem ich viel .asoundrcgegoogelt hatte, fand ich eine Datei¹, die sehr nahe an dem liegt, wonach ich suche:

pcm.mycard {
    type hw
    card 0
}

ctl.mycard {
    type hw
    card 0
}

pcm.myconvert {
    type plug
    slave {
        pcm "myrecord"
        format S16_LE
    }
}

pcm.myrecord {
    type file
    format "raw"
    slave.pcm "mycard"
    file "| oggenc -Q -q6 -r -B %b -C %c -R %r -o /tmp/record-$(date +%%Y-%%m-%%d_%%H%%M%%S).ogg -"
}

pcm.!default{
   type asym
   playback.pcm "myconvert"
   capture.pcm "mycard"
}

Diese Konfiguration ermöglicht das Aufzeichnen einer oggDatei mit allen auf meinem Computer abgespielten Audiodaten. Was ich jetzt tun möchte, ist, den pcm.myrecordTeil der Konfiguration so zu ändern , dass das Audio in einer virtuellen Karte "gestreamt" wird, die ich später mit beispielsweise aufnehmen könnte arecord. Ich würde mich freuen, wenn mir jemand dabei helfen könnte.

Ich habe Folgendes versucht: Wie erstelle ich ein virtuelles ALSA-Gerät, von dem aus ich alles aufzeichnen kann, was abgespielt wird? aber das hat bei mir nicht funktioniert. Unten die Ausgabe von arecord -L:

muammar@zarathustra /tmp 
  % arecord -L                                                                                                                                         !10015
null
    Discard all samples (playback) or generate zero samples (capture)
default:CARD=PCH
    HDA Intel PCH, CS4208 Analog
    Default Audio Device
sysdefault:CARD=PCH
    HDA Intel PCH, CS4208 Analog
    Default Audio Device
front:CARD=PCH,DEV=0
    HDA Intel PCH, CS4208 Analog
    Front speakers
dmix:CARD=PCH,DEV=0
    HDA Intel PCH, CS4208 Analog
    Direct sample mixing device
dsnoop:CARD=PCH,DEV=0
    HDA Intel PCH, CS4208 Analog
    Direct sample snooping device
hw:CARD=PCH,DEV=0
    HDA Intel PCH, CS4208 Analog
    Direct hardware device without any conversions
plughw:CARD=PCH,DEV=0
    HDA Intel PCH, CS4208 Analog
    Hardware device with all software conversions
default:CARD=Loopback
    Loopback, Loopback PCM
    Default Audio Device
sysdefault:CARD=Loopback
    Loopback, Loopback PCM
    Default Audio Device
front:CARD=Loopback,DEV=0
    Loopback, Loopback PCM
    Front speakers
surround21:CARD=Loopback,DEV=0
    Loopback, Loopback PCM
    2.1 Surround output to Front and Subwoofer speakers
surround40:CARD=Loopback,DEV=0
    Loopback, Loopback PCM
    4.0 Surround output to Front and Rear speakers
surround41:CARD=Loopback,DEV=0
    Loopback, Loopback PCM
    4.1 Surround output to Front, Rear and Subwoofer speakers
surround50:CARD=Loopback,DEV=0
    Loopback, Loopback PCM
    5.0 Surround output to Front, Center and Rear speakers
surround51:CARD=Loopback,DEV=0
    Loopback, Loopback PCM
    5.1 Surround output to Front, Center, Rear and Subwoofer speakers
surround71:CARD=Loopback,DEV=0
    Loopback, Loopback PCM
    7.1 Surround output to Front, Center, Side, Rear and Woofer speakers
dmix:CARD=Loopback,DEV=0
    Loopback, Loopback PCM
    Direct sample mixing device
dmix:CARD=Loopback,DEV=1
    Loopback, Loopback PCM
    Direct sample mixing device
dsnoop:CARD=Loopback,DEV=0
    Loopback, Loopback PCM
    Direct sample snooping device
dsnoop:CARD=Loopback,DEV=1
    Loopback, Loopback PCM
    Direct sample snooping device
hw:CARD=Loopback,DEV=0
    Loopback, Loopback PCM
    Direct hardware device without any conversions
hw:CARD=Loopback,DEV=1
    Loopback, Loopback PCM
    Direct hardware device without any conversions
plughw:CARD=Loopback,DEV=0
    Loopback, Loopback PCM
    Hardware device with all software conversions
plughw:CARD=Loopback,DEV=1
    Loopback, Loopback PCM
    Hardware device with all software conversions

Vielen Dank.

  1. https://bbs.archlinux.org/viewtopic.php?id=167830
Muammar
quelle
@CL wie ich oben geschrieben habe, habe ich es versucht und es hat nicht funktioniert. Ich denke jedoch, ich habe eine Lösung gefunden. Ich werde es später veröffentlichen, wenn ich 100% sicher bin.
Muammar

Antworten:

11

Ich habe dieses Problem wie folgt gelöst:

Laden Sie zuerst das snd-aloopModul:

sudo modprobe snd-aloop

Dadurch wird ein neues Gerät mit dem Namen erstellt Loopback:

± % cat /proc/asound/cards                                                                                                                             !10017

 0 [PCH            ]: HDA-Intel - HDA Intel PCH
                      HDA Intel PCH at 0xc1814000 irq 60
 1 [HDMI           ]: HDA-Intel - HDA Intel HDMI
                      HDA Intel HDMI at 0xc1810000 irq 61
 2 [Loopback       ]: Loopback - Loopback
                      Loopback 1

Aus den oben gezeigten Informationen müssen wir zwei hwGeräte erstellen :

  1. hw:0,0 (PCH ist meine Hauptsoundkarte).
  2. hw:2,1(Das Loopbackvirtuelle Gerät).

Normalerweise haben hwGeräte die Form : hw:X,Y. Für unsere Zwecke scheint es, dass Yfür die Hauptkarte immer ist, 0während für die Loopbackwir Ygleich sind 1.

Damit all dies funktioniert, benötigen wir eine ~/.asoundrcDatei mit den folgenden Angaben :

pcm.!default {
  type asym
  playback.pcm "LoopAndReal"
  #capture.pcm "looprec"
  capture.pcm "hw:X1,Y1"
}

pcm.looprec {
    type hw
    card "Loopback"
    device 1
    subdevice 0
}


pcm.LoopAndReal {
  type plug
  slave.pcm mdev
  route_policy "duplicate"
}


pcm.mdev {
  type multi
  slaves.a.pcm pcm.MixReale
  slaves.a.channels 2
  slaves.b.pcm pcm.MixLoopback
  slaves.b.channels 2
  bindings.0.slave a
  bindings.0.channel 0
  bindings.1.slave a
  bindings.1.channel 1
  bindings.2.slave b
  bindings.2.channel 0
  bindings.3.slave b
  bindings.3.channel 1
}


pcm.MixReale {
  type dmix
  ipc_key 1024
  slave {
    pcm "hw:X1,Y1"
    rate 48000
    #rate 44100
    periods 128
    period_time 0
    period_size 1024 # must be power of 2
    buffer_size 8192
  }
}

pcm.MixLoopback {
  type dmix
  ipc_key 1025
  slave {
    pcm "hw:Loopback,0,0"
    rate 48000
    #rate 44100
    periods 128
    period_time 0
    period_size 1024 # must be power of 2
    buffer_size 8192
  }
}

Ändern Sie hw:X1,Y1mit den Werten für Ihre Hauptkarte (in meinem Fall hw:0,0).

Sie können testen, ob diese Konfiguration funktioniert, indem Sie etwas auf Ihrem Computer abspielen. Wenn Sie es hören, ist es in Ordnung. Lassen Sie uns nun etwas auf dem Computer abspielen und es von diesem virtuellen Gerät aufnehmen mit ffmpeg:

ffmpeg -f alsa -i hw:X2,Y2 -c:a libmp3lame -b:a 256k -vn capture.mp3

Wo hw:X2,Y2muss Loopbackin diesem Fall durch das Gerät ersetzt werden hw:2,1.

Ich nehme an, dass die Verwendung auch arecordfunktionieren sollte.

Muammar
quelle
3
Vielen Dank dafür. Ich habe jahrelang versucht, dies zum Laufen zu bringen, und Ihr Beispiel hat für mich so funktioniert, wie es ist.
Pistos
2
@ Pistos Ich bin froh, dass es helfen konnte.
Muammar
Genau wie @Pistos !! Ich liebe dich \ o /
Marcelo Teixeira Ruggeri
0

Ich habe die Anweisung befolgt und es funktioniert wie erwartet mit einer Ausnahme: Wenn eine Anwendung als Chrome-Soundkarte nach einer anderen Zugriff auf die Loopback-Schnittstelle erhält, schlägt dies fehl. Zum Beispiel beginne ich mit der Aufnahme auf Loopback:

arecord -f cd -Dhw:Loopback,1,0 sample1.wav

Dann öffne ich den Browser (es ist wichtig, einen neuen Prozess zu starten) und öffne dann ein Video. Nach solchen Schritten gibt es zwei mögliche Ergebnisse (ich weiß nicht, worauf es ankommt). Erstes Szenario: Ich kann keine Stimme hören und arecord nimmt nichts auf. Zweites Szenario: Ich kann nicht einmal ein Video abspielen und es wird eine Meldung angezeigt, dass der Browser nicht auf das Audiogerät zugreifen kann.

Wenn ich den Browser zum ersten Mal öffne und ein Video wiedergebe und dann mit der Aufnahme beginne, erhalte ich immer das erwartete Ergebnis: Ich kann Sprache hören (Routing zur Soundkarte funktioniert) und Daten werden in der Datei gespeichert (Routing zum Loopback funktioniert ebenfalls).

@muammar Hast du auch solche Probleme gehabt?

Adam Stepniak
quelle