Reindirizzare a livello di programmazione l'output audio di un programma specifico su file


8

Vorrei reindirizzare l'output audio di un programma su file, sulla riga di comando, come in

$ redirect-wrapper file.wav my-program

così che

  • Non sento l'output del programma, ovvero l'output dovrebbe andare solo al file
  • Non registro nulla oltre al programma, ovvero solo questo programma specifico viene reindirizzato al file
  • il resto del sistema audio è lasciato completamente indisturbato, nessuna opzione di configurazione è cambiata avanti e indietro o qualcosa del genere

C'è un modo per fare questo? Questa domanda correlata non aiuta, ho bisogno di una soluzione a riga di comando, nessun "clic lì, quindi lì". Questo probabilmente è anche correlato, ma si basa anche sull'applicazione grafica pavucontrol. Ho trovato un'alternativa terminale a pavucontrol, pacmd.

Ma ciò rende ancora possibile solo il seguente compromesso:

  1. Ottieni il sink predefinito e salva quello che era. Come? Probabilmente ci sta passandopacmd list-sinks
  2. Impostare il sink predefinito sul sink snd-aloop con pacmd set-default-sink.
  3. Registra da quel lavandino.
  4. Avvia applicazione
  5. Attendi fino a quando l'applicazione ha aperto l'input del sink: pacmd list-sink-inputs | grep name-of-my-programse trova qualcosa, l'input è aperto.
  6. Cambia il valore predefinito con quello che era pacmd set-default-sink.
  7. Interrompere la registrazione una volta chiusa l'applicazione.

Ma questo cambia ancora il sink predefinito per un periodo di tempo massimo di un paio di minuti (l'ingresso del sink di solito non viene aperto fino a quando il programma non riproduce effettivamente suoni che non devono essere subito dopo l'avvio). Ho implementato questo compromesso; Github .

Ancora alla ricerca di risposte non compromettenti.


Questo potrebbe aiutare: swview.org/node/213 Sta cambiando temporaneamente ~/.asoundrc. Forse puoi evitarlo in qualche modo.
rudimeier,

@rudimeier Questo sta impostando globalmente il dispositivo di output predefinito. Non importa se da ~ / .asoundrc o in altro modo, rovinerà sempre il resto del sistema audio.
Nessuno il

Nessuna idea, ma penso che tu sia sulla buona strada. L'output di pacmd listmostra quali sorgenti e pozzi sono collegati a programmi particolari, quindi potrebbe esserci un modo per cambiarli. Prova a chiedere sulla lista di pulseaudio su lists.freedesktop.org/mailman/listinfo/pulseaudio-discuss I manutentori / sviluppatori sono lì e sono abbastanza utili.
Joe,

@Joe La riassegnazione dei lavandini è possibile con pacmd, sì, ma perché sono allocati solo quando l'audio inizia effettivamente a giocare (almeno per alcuni programmi; Firefox), ciò significa che dovrei cercarli in un ciclo stretto e probabilmente mi mancherebbe primi 0,5 secondi circa dell'audio. Grazie per il suggerimento sulla mailing list. :-)
Nessuno il

Risposte:


2

Guardando così la documentazione di pulseaudio.

man pulseaudio

Abbiamo le seguenti variabili d'ambiente

   $PULSE_SERVER: the server string specifying the server to connect to when a client asks for a sound server connection  and  doesn't  explicitly  ask  for  a  specific
   server.  The server string is a list of server addresses separated by whitespace which are tried in turn. A server address consists of an optional address type speci‐
   fier (unix:, tcp:, tcp4:, tcp6:), followed by a path or host address. A host address may include an optional port number. A server address may be prefixed by a string
   enclosed in {}. In this case the following server address is ignored unless the prefix string equals the local hostname or the machine id (/etc/machine-id).

   $PULSE_SINK: the symbolic name of the sink to connect to when a client creates a playback stream and doesn't explicitly ask for a specific sink.

Si spera che ciò ti consenta di sostituire completamente il sink di pulseaudio e, se ciò non bastasse, esegui il nostro server pulseaudio monouso.

Facendo riferimento a questa pagina ( /ubuntu/60837/record-a-programs-output-with-pulseaudio ), scopriamo il comando parec/ pacat(sono alias) che può registrare da e scrivere su sink e flussi.

Mettendo insieme questo abbiamo il seguente wrapper (che non ho effettivamente eseguito, anche se ho avuto successo con questo metodo per funzionare su una base ad hoc)

sink_name="sink-$(date +%s)"
pacat $sink_name.monitor 
parec -d steam.monitor | oggenc -b 192 -o /tmp/steam.ogg --raw - &
pid=$!
PULSE_SINK=$sink_name "$@"
kill $pid

Ora mi sento stupido. Grazie. ^^ Alla fine imparerò a leggere prima la documentazione.
Nessuno il
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.