Registra l'output di un programma con PulseAudio


49

Vorrei registrare un output di un programma con PulseAudio usando la riga di comando / script bash. È importante non registrare tutto l'output, ma solo l'output di un programma specifico.

Ho pensato che avrei dovuto creare un nuovo null-sink e quindi spostare l'output del programma su questo nuovo sink. Che dire parec di utilizzare questo monitor specifici per registrare.

Il primo passo sarebbe qualcosa del genere:

pactl load-module module-null-sink sink_name=steam

Ma come spostare l'output del programma ora su questo sink?
E come registrare il sink specifico con uno script bash?

Risposte:


52

Prova qualcosa del genere:

In un terminale inserire

pacmd

(questa è la CLI del PulseAudio-Server) quindi utilizzare

list-sink-inputs

(dove ottieni gli indici degli input correnti) Ora trova l'indice dei tuoi input. Ora denominato $ INDICE

la parte di script è:

pactl load-module module-null-sink sink_name=steam
pactl move-sink-input $INDEX steam
parec -d steam.monitor | oggenc -b 192 -o steam.ogg --raw -

spiegazioni:

  • Il primo comando aggiungerà un null-sink come già sapevi.
  • Il secondo comando sposta l'ingresso sink dal lavandino audio standard su Steam
  • Il terzo comando registra il monitor del dispositivo steam (-d) e inserisce l'output (raw-wave-stream) in oggenc, che codifica questo wave-stream in un file oga. (per lame mp3)

Fantastico, grazie mille per questa grande risposta! :)
Forza

2
puoi per favore spiegare come annullare questa operazione? i miei sink nulli sono ancora associati a varie applicazioni e ora non ho alcun suono!
ixtmixilix,

@ixtmixilix: il modo più semplice per ripristinare tutte le impostazioni predefinite è semplicemente uccidere e riavviare il server pulseaudio. Se impostato su autospawn (questo è il valore predefinito) si emette semplicemente pulseaudio -kin un terminale.
Takkat,

1
@ixtmixilix Quando esegui, list-sink-inputsprendi nota del sinkvalore. Per tornare indietro, corri pactl move-sink-input $INDEX $SINK. Qualcosa del generepactl move-sink-input 4719 1
Ciaran,

27

Migliorare la risposta Waschtl di questo thread in modo che SIA POSSIBILE ASCOLTARE E REGISTRARE il suono dell'app:

Innanzitutto, cerchiamo il nostro output predefinito e inseriamo il nome del sink in $DEFAULT_OUTPUT:

$ pacmd list-sinks | grep -A1 "* index"
  * index: 1
    name: <alsa_output.pci-0000_00_1b.0.analog-stereo>
$ DEFAULT_OUTPUT=$(pacmd list-sinks | grep -A1 "* index" | grep -oP "<\K[^ >]+")
$ echo $DEFAULT_OUTPUT
alsa_output.pci-0000_00_1b.0.analog-stereo

Quindi, creiamo un sink combinato che ha un solo slave: $ DEFAULT_OUTPUT . Il suono generato dall'app (sorgente) verrà inoltrato al sink slave (ad es. Output reale) e lo registreremo anche. È diverso da un sink null in cui il suono della sorgente non viene inoltrato.

$ pactl load-module module-combine-sink \
  sink_name=record-n-play slaves=$DEFAULT_OUTPUT \
  sink_properties=device.description="Record-and-Play"

sink_properties è facoltativo e può presentare bug se si utilizzano spazi nel nome della descrizione.

Quindi, potremmo usare il pactl move-sink-input ...comando della risposta Waschtl (con record-n-play invece di steam ) ma la GUI pavucontrolè più semplice (e ottima per il controllo / risoluzione dei problemi):

$ sudo apt-get install pavucontrol
$ pavucontrol &

Quindi, riproduciamo un po 'di suono nell'app che vogliamo registrare. Nella pavucontrol Playbackscheda, selezioniamo nell'elenco a discesa dell'app: "Registra e riproduci" .

Finalmente, siamo bravi a registrare e ascoltare allo stesso tempo! ( esempio lame mp3, esegui in primo piano)

$ parec --format=s16le -d record-n-play.monitor | \
  lame -r --quiet -q 3 --lowpass 17 --abr 192 - "temp.mp3"

Oppure possiamo registrare in background e fermarci in qualsiasi momento:

$ parec --format=s16le -d record-n-play.monitor | \
  lame -r --quiet -q 3 --lowpass 17 --abr 192 - "temp.mp3" \
   > /dev/null &1>/dev/null
$ killall -q parec lame

NB:

  • Per annullare tutto o ripetere la procedura: eliminare o ripristinare i lavandini utilizzando questa risposta . pulseaudio -kfunziona benissimo per ripristinare tutto ai valori predefiniti della sessione.
  • Se cambiamo l'output predefinito nelle Impostazioni audio del sistema, l'impostazione di riproduzione dell'app personalizzata verrà sovrascritta e dovremo tornare indietro in Pavucontrol per ripristinarla all'interfaccia combinata.
  • Per poter ascoltare il suono da diverse interfacce "reali" (ad es. Cuffie, uscita HDMI, ecc ...), dovremmo includere tutte le uscite "reali" che potremmo usare per ascoltare, come schiavi slink record-n-play , come: pactl load-module module-combine-sink sink_name=record-n-play slaves=real-output-1,real-output-2.

EDIT: Attenzione, dal momento che Ubuntu 18 (forse anche 17), il sink combinato tende a diventare il dispositivo di output di sistema predefinito, anziché il dispositivo di output reale. Pertanto, quando si modifica il volume utilizzando l'icona del suono nella barra delle applicazioni, questo influisce sul suono registrato. Soluzione alternativa: dopo aver creato il sink combinato, aprire pavucontrolnella scheda Output. Seleziona "Visualizza: Dispositivi di output virtuali" e reimposta il volume audio del sink combinato al 100%. Quindi selezionare "Visualizza: Dispositivi di output hardware" e premere l'icona verde "Definisci come alternativa" sul dispositivo di output reale.


9

La risposta di @ Waschtl è fantastica. @ixtmixilix ha chiesto informazioni sul ripristino dell'audio normale al termine della registrazione. Ecco il modo più semplice che conosco:

Installa ed esegui la pavucontrolGUI. Dovresti vedere la tua applicazione di uscita audio e il suo misuratore di volume sotto la Playbackscheda lì dentro. Ci sarà un pulsante accanto ad esso che mostra che sta giocando su Null Output . Fare clic su quello e cambiarlo nella normale uscita audio, Audio analogico stereo incorporato nel mio caso.

Ecco uno screenshot di ciò che stai cercando:

immagine dello schermo

Puoi anche usare questo approccio per impostare la tua registrazione in futuro, dopo aver eseguito il load-modulecomando nella risposta di @ Waschtl per creare il sink.


Se puoi, carica una schermata in Imgur e collegala alla tua risposta.
Lucio

Non so se sia fattibile, ma penso che il modo migliore sia scaricare il modulo di output null, in modo che le nuove riproduzioni non lo raccolgano di default
Jack

6

Migliorando ulteriormente la risposta di KrisWebDev , se vuoi che record-n-play sia sempre disponibile, prima scopri l'output predefinito:

pacmd list-sinks | grep -A1 "* index" | grep -oP "<\K[^ >]+"

che produrrà qualcosa di simile:

alsa_output.pci-0000_00_1b.0.analog-stereo

Quindi, crea un file ~/.config/pulse/default.pa:

.include /etc/pulse/default.pa

load-module module-combine-sink sink_name=record-n-play slaves=alsa_output.pci-0000_00_1b.0.analog-stereo sink_properties=device.description="Record-and-Play"

Si prega di sostituire alsa_output.pci-0000_00_1b.0.analog-stereocon qualsiasi output ottenuto dal pacmdcomando. Pulse non legge il file di configurazione predefinito quando esiste un file di configurazione personalizzato - ecco perché la prima riga sopra include il file di configurazione predefinito. In questo modo pulseaudio carica ancora prima la configurazione predefinita.

Esegui pulseaudio -kper terminare l'istanza pulseaudio corrente in modo che ne venga avviata una nuova con la nuova configurazione.

Se in qualsiasi momento desideri annullare le modifiche qui, rimuovi il ~/.config/pulse/default.pafile ed eseguilo pulseaudio -k.

Se vuoi che il record-n-play sia il sink predefinito per tutte le uscite, puoi farlo aggiungendo ancora un'altra riga alla fine di ~/.config/pulse/default.pa:

set-default-sink record-n-play

Per i programmi su cui pulseaudio ha già memorizzato informazioni, ricorda qualsiasi dispositivo di output utilizzato per ultimo, quindi dovrai riconfigurare manualmente quelli usando uno dei metodi descritti nella risposta di KrisWebDev.


2

Ho creato questo script bash in base alle risposte fornite dalle risposte @Waschtl e @KrisWebDev.

Disponibile qui: https://gist.github.com/ramast/4be3314bc73f28f55e3604497188b007

Come usare?

$ ./pulse-recorder.bash 
    index: 225
                application.name = "ALSA plug-in [mplayer]"
                module-stream-restore.id = "sink-input-by-application-name:ALSA plug-in [mplayer]"
Choose recording index: 225
temp.mp3 file already exist, replace (y/n)? y

Nuova versione

Ho creato uno script Python che offre alcuni miglioramenti rispetto a quello precedente. https://gist.github.com/ramast/c47bd5e57586e9c2deb74975e27089f0

Come usare?

$ ./pulse-recorder.py 

1 - ALSA plug-in [mplayer]
2 - AudioIPC Server

Please enter a number: 1

Your selection was: ALSA plug-in [mplayer]
Please press enter when you are ready to start

Quando si preme invio, la registrazione inizierà immediatamente. se al momento in cui premi invio l'applicazione è già stata interrotta (ad esempio hai chiuso mplayer per esempio) lo script attenderà fino a quando l'app non verrà visualizzata di nuovo e inizierà la registrazione.

L'unico inconveniente di quello script (rispetto a quello originale) è che se l'elenco contiene due voci con lo stesso nome, lo script non si comporterà correttamente. Per esempio

$ ./pulse-recorder.py                                                                                                      

1 - ALSA plug-in [mplayer]
2 - ALSA plug-in [mplayer]

Nel caso in cui si disponga di più uscite (ad esempio altoparlanti, più cuffie, monitor audio), è possibile sostituire sulla linea 21 con ad esempio: default_output = alsa_output.pci-0000_00_1b.0.analog-stereo dove questo proviene dall'output dell'elenco pacmd -sinks
smaudet
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.