Grave a saída de um programa com o PulseAudio

43

Eu gostaria de gravar uma saída de um programa com PulseAudio usando o script linha de comando / bash. É importante não registrar todas as saídas, mas apenas a saída de um programa específico.

Eu pensei que teria que criar um novo nulo-coletor e mover a saída do programa para esse novo coletor. Do que dizer parec para usar este monitor específico para gravar.

O primeiro passo seria algo assim:

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

Mas como mover a saída do programa agora para esse coletor?
E como gravar o sumidouro específico com um script bash?

    
por user5950 10.09.2011 / 17:49

5 respostas

46

Tente algo assim:

Em um terminal, digite

pacmd

(esta é a CLI do servidor do PulseAudio) então use

list-sink-inputs

(onde você obtém os índices das entradas em execução) Agora encontre o índice de sua entrada. Agora referido como $ INDEX

a parte que pode ser escrita é:

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 -

Explicações:

  • O primeiro comando adicionará um nulo-coletor como você já sabia.
  • O segundo comando move a entrada sink do seu coletor de áudio padrão para vapor
  • O terceiro comando registra o monitor do dispositivo steam (-d) e coloca a saída (raw-wave-stream) em oggenc, que codifica esse fluxo de onda em um arquivo oga. (para mp3 usar coxo)
por Waschtl 10.09.2011 / 20:10
18

Melhorando Resposta do Waschtl deste tópico para que você possa AMBOS OUVIR E GRAVAR o som do aplicativo :

Primeiro, procuramos nossa saída padrão e colocamos seu nome de coletor em $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

Em seguida, criamos um sumidouro combinado que tem apenas um escravo : $ DEFAULT_OUTPUT . O som gerado pelo aplicativo (fonte) será encaminhado para o escravo escravo (ou seja, saída real), e também vamos gravá-lo. É diferente de um dissipador nulo onde o som da fonte não é encaminhado.

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

sink_properties é opcional e pode causar um erro se você usar espaços no nome da descrição.

Em seguida, poderíamos usar o comando pactl move-sink-input ... da Resposta do Waschtl (com record-n-play em vez de vapor ), mas a GUI pavucontrol é mais simples (e ótima para verificação / solução de problemas):

$ sudo apt-get install pavucontrol
$ pavucontrol &

Em seguida, reproduzimos alguns sons no aplicativo que queremos gravar. Na aba pavucontrol Reprodução , selecionamos na lista suspensa do aplicativo: "Gravação e reprodução" .

Finalmente, é bom gravar e ouvir ao mesmo tempo! ( lame exemplo de mp3, executado em primeiro plano)

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

Ou podemos gravar em segundo plano e parar a qualquer 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:

  • Para desabilitar tudo ou repetir o procedimento: Exclua ou reconfigure os coletores usando esta resposta . pulseaudio -k funciona muito bem para redefinir tudo para os padrões da sessão.
  • Se alterarmos a saída padrão nas configurações de som do sistema, a configuração de reprodução do aplicativo personalizado será substituída e teremos que voltar ao pavucontrol para defini-lo de volta à interface combinada.
  • Para poder ouvir o som de várias interfaces "reais" (por exemplo, fones de ouvido, saída HDMI, etc ...), devemos incluir todas as saídas "reais" que podemos usar para ouvir, como registro -n-play slink slaves, como: pactl load-module module-combine-sink sink_name=record-n-play slaves=real-output-1,real-output-2 .
por KrisWebDev 24.01.2016 / 11:41
7

@ A resposta de Waschtl é fantástica. @ixtmixilix perguntou sobre como restaurar o áudio regular após a conclusão da gravação. Aqui está a maneira mais fácil que eu conheço:

Instale e execute a GUI pavucontrol . Você deve ver seu aplicativo de saída de áudio e seu medidor de volume na guia Reprodução . Haverá um botão ao lado mostrando que está sendo reproduzido em Saída nula . Clique nele e mude para a saída de áudio comum, Estéreo analógico de áudio embutido no meu caso.

Aqui está uma captura de tela do que você está procurando:

Você também pode usar essa abordagem para configurar sua gravação no futuro, depois de executar o comando load-module na resposta do @ Waschtl para criar o coletor.

    
por Jack O'Connor 02.03.2013 / 19:02
5

Melhorando ainda mais a resposta do KrisWebDev , se quiser que o record-n-play esteja sempre disponível, primeiro descubra a saída padrão:

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

que produzirá algo como:

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

Em seguida, crie um arquivo ~/.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"

Por favor, substitua alsa_output.pci-0000_00_1b.0.analog-stereo pela saída que você obteve do comando pacmd . O Pulse não lê o arquivo de configuração padrão quando existe um arquivo de configuração personalizado - é por isso que a primeira linha acima inclui o arquivo de configuração padrão. Dessa forma pulseaudio ainda carrega a configuração padrão primeiro.

Execute pulseaudio -k para eliminar a instância atual do pulseaudio, para que uma nova seja iniciada com a nova configuração.

Se a qualquer momento você quiser desfazer as alterações aqui, basta remover o arquivo ~/.config/pulse/default.pa e executar pulseaudio -k .

Se você quiser que o record-n-play seja o coletor padrão para todas as saídas, você pode fazer isso adicionando outra linha ao final de ~/.config/pulse/default.pa :

set-default-sink record-n-play

Para programas em que o pulseaudio já possui informações armazenadas, ele se lembra de qualquer dispositivo de saída usado por último, então você terá que reconfigurar manualmente aqueles usando um dos métodos descritos na resposta do KrisWebDev.

    
por Jonas Berlin 19.07.2016 / 10:56
2

Eu criei este script baseado nas respostas fornecidas pelas respostas @Waschtl e @KrisWebDev.

Disponível aqui: link

Como usar?

$ ./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
    
por Ramast 01.05.2017 / 21:10