Redirecionar programaticamente a saída de áudio de um programa específico para o arquivo

8

Eu gostaria de redirecionar a saída de áudio de um programa para o arquivo, na linha de comando, como em

$ redirect-wrapper file.wav my-program

para que

  • Eu não ouço a saída do programa, ou seja, a saída deve somente ir para o arquivo
  • Eu não gravo nada além do programa, ou seja, apenas o programa específico é redirecionado para o arquivo
  • o restante do sistema de áudio é deixado completamente inalterado, sem opções de configuração alteradas para trás e para frente ou algo parecido

Existe uma maneira de fazer isso? Esta questão relacionada não não ajuda, eu preciso de uma solução de linha de comando , não "clique lá, então lá". Este provavelmente também está relacionado, mas também depende do aplicativo gráfico pavucontrol. Eu encontrei uma alternativa terminal para pavucontrol, pacmd.

Mas isso ainda torna possível o seguinte comprometimento:

  1. Obtenha o coletor padrão e salve o que era. Como? Provavelmente percorrendo pacmd list-sinks
  2. Definir o coletor padrão para o coletor snd-aloop com pacmd set-default-sink .
  3. Grave daquele coletor.
  4. Iniciar aplicativo
  5. Espere até que o aplicativo abra sua entrada de coletor: pacmd list-sink-inputs | grep name-of-my-program se isso encontrar algo, a entrada está aberta.
  6. Altere o padrão de volta para o que era com pacmd set-default-sink .
  7. Parar de gravar quando o aplicativo é fechado.

Mas isso ainda altera o coletor padrão para um intervalo de tempo de até alguns minutos (a entrada do coletor geralmente não é aberta até que o programa esteja realmente reproduzindo sons que não precisam estar logo após o lançamento). Eu implementei este compromisso; Github .

Ainda procurando respostas não comprometedoras.

    
por Nobody 13.11.2016 / 16:56

1 resposta

3

Umm olhando para a documentação do pulseaudio.

man pulseaudio

Temos as seguintes variáveis de 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.

Isso deve permitir que você complete a substituição do coletor pulseaudio, e se isso não for suficiente, execute nosso próprio servidor pulseaudio de uso único.

Referindo-se a esta página ( link ), nós descobrimos sobre o parec / pacat comando (são aliases) que podem gravar e gravar em coletores e fluxos.

Juntando isso, temos o seguinte wrapper (que eu não executei de verdade - embora eu tenha conseguido esse método funcionar em uma 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
    
por 24.11.2016 / 22:38