Redirija programáticamente la salida de audio del programa específico al archivo

8

Me gustaría redirigir la salida de audio de un programa a un archivo, en la línea de comando, como en

$ redirect-wrapper file.wav my-program

así que eso

  • No escucho la salida del programa, es decir, la salida solo debe ir al archivo
  • No grabo nada además del programa, es decir, solo este programa específico se redirige al archivo
  • el resto del sistema de audio se deja completamente intacto, no se cambian las opciones de configuración de un lado a otro o algo así

¿Hay alguna forma de hacer esto? Esta pregunta relacionada no ayuda, necesito una solución de línea de comando, no "haga clic allí, luego allí". Esto probablemente también esté relacionado, pero también se basa en la aplicación gráfica pavucontrol. Encontré una alternativa de terminal a pavucontrol, pacmd.

Pero esto todavía solo hace posible el siguiente compromiso:

  1. Obtenga el sumidero predeterminado y guarde lo que era. ¿Cómo? Probablemente hurgandopacmd list-sinks
  2. Establezca el sumidero predeterminado en el sumidero snd-aloop con pacmd set-default-sink.
  3. Grabar desde ese fregadero.
  4. Aplicación de inicio
  5. Espere hasta que la aplicación haya abierto su entrada de receptor: pacmd list-sink-inputs | grep name-of-my-programsi esto encuentra algo, la entrada está abierta.
  6. Cambie el valor predeterminado de nuevo a lo que era pacmd set-default-sink.
  7. Deja de grabar una vez que la aplicación se cierre.

Pero esto todavía cambia el sumidero predeterminado por un intervalo de tiempo de hasta un par de minutos (la entrada del sumidero generalmente no se abre hasta que el programa realmente está reproduciendo sonidos que no es necesario que sea justo después del inicio). Implementé este compromiso; Github .

Todavía estoy buscando respuestas no comprometedoras.

Nadie
fuente
Esto podría ayudar: swview.org/node/213 Él está cambiando temporalmente ~/.asoundrc. Tal vez puedas evitar esto de alguna manera.
rudimeier
@rudimeier Eso configura globalmente el dispositivo de salida predeterminado. No importa si es de ~ / .asoundrc o de otra manera, siempre estropeará el resto del sistema de audio.
Nadie
No tengo idea, pero creo que estás en el camino correcto. El resultado de pacmd listmuestra qué fuentes y sumideros están conectados a programas particulares, por lo que puede haber una forma de cambiarlos. Intente preguntar en la lista de pulseaudio en lists.freedesktop.org/mailman/listinfo/pulseaudio-discuss Los mantenedores / desarrolladores están allí y son bastante útiles.
Joe
@Joe Reasignar sumideros es posible con pacmd, sí, pero debido a que solo se asignan cuando el audio comienza a reproducirse (al menos para algunos programas; Firefox), eso significa que necesitaría buscarlos en un circuito cerrado y posiblemente perdería el primeros 0.5s más o menos del audio. Gracias por el consejo sobre la lista de correo. :-)
Nadie

Respuestas:

2

Umm mirando la documentación de pulseaudio.

man pulseaudio

Tenemos las siguientes variables de entorno.

   $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.

Con suerte, esto debería permitirle reemplazar el sumidero pulseaudio, y si esto no es suficiente, ejecute nuestro propio servidor pulseaudio de un solo uso.

En referencia a esta página ( /ubuntu/60837/record-a-programs-output-with-pulseaudio ), descubrimos el comando parec/ pacat(son alias) que pueden grabar y escribir en sumideros y corrientes.

En conjunto, tenemos el siguiente contenedor (que en realidad no he ejecutado, aunque he logrado que este método funcione de manera 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
Att Righ
fuente
Ahora me siento estúpido. Gracias. ^^ Eventualmente aprenderé a leer la documentación primero.
Nadie