Registre a saída de um programa com o PulseAudio -- scripts campo com pulseaudio campo com audio-recording camp askubuntu Relacionado O problema

Record a program's output with PulseAudio


57
vote

problema

português

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

Eu pensei que teria que criar uma nova pia nula e mover a saída do programa para esta nova pia. 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 esta pia?
E como registrar a pia específica com um script bash?

english

I would like to record an output of a program with PulseAudio using command line/bash script. It is important not to record all output, but only the output from one specific program.

I thought I would have to create a new null-sink and than move the program's output to this new sink. Than tell parec to use this specific monitor to record.

The first step would be something like this:

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

But how to move the program's output now to this sink?
And how to record the specific sink with a bash script?

        

Lista de respostas

61
 
vote
vote
Melhor resposta
 

Tente algo assim:

em um terminal, digite

  cowsay6   

(este é o CLI do PulsaAudio-Server) então use

  cowsay7   

(onde você recebe os índices das entradas em execução) Agora encontre o índice da sua entrada. Agora referido como $ index

A parte scriptable é:

  cowsay8   

Explicações:

  • O primeiro comando adicionará uma pia nula ao já saber.
  • O segundo comando move a entrada da pia do seu pia padrão-áudio para vapor
  • O terceiro comando registra o monitor do dispositivo Steam (-D) e coloca a saída (fluxo de onda bruta) em OGGENC, que codifica esse fluxo de onda para um arquivo OGA. (para uso mp3 coxo)
 

Try something like this:

In a terminal enter

pacmd 

(this is the CLI of the PulseAudio-Server) then use

list-sink-inputs 

(where you get the indices of the running inputs) Now find the index of your input. Now referred to as $INDEX

the scriptable part is:

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 - 

Explanations:

  • The first command will add a null-sink as you already knew.
  • The second command moves the sink-input from your standard-audio-sink to steam
  • The third command records the monitor of the device steam (-d) and puts the output (raw-wave-stream) into oggenc, which encodes this wave-stream to an oga-file. (for mp3 use lame)
 
 
       
       
38
 
vote

Melhorando WASCHTL Resposta deste tópico para que você possa ambos ouvir e gravar o som do aplicativo :

Primeiro, procuramos nossa saída padrão e colocamos o nome da pia no $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    

Então, criamos um pia combinada que tem apenas um escravo: $ Default_Output . O som gerado pelo aplicativo (fonte) será encaminhado para a pia escrava (ou seja, saída real), e também iremos gravá-lo. É diferente de um pia nula Onde a fonte O som 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 bug se você usar espaços no nome da descrição.

Então, podemos usar ABCDEFGHIJKLMNABCDEFGHIJKLMN4 comando de WASCHTL Resposta (com registro -P-play em vez de steam ) mas GUI pavucontrol é mais simples (e ótimo para verificação / solução de problemas):

  $ sudo apt-get install pavucontrol $ pavucontrol &    

Então, jogamos algum som no aplicativo que queremos gravar. Em ABCDEFGHIJKLMNABCDEFGHIJKLMN7 Reprodução Tab, selecionamos na lista suspensa App: "Record-and Play" .

Finalmente, somos bons para gravar e ouvir ao mesmo tempo! ( lame Exemplo mp3, execute 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 no fundo 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 resmungar tudo ou repetir o procedimento: Excluir ou redefinir as pias usando Esta resposta . $ 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 0 funciona 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á sobrescrita e teremos que voltar no PavUControl para configurá-lo de volta para a interface combinada.
  • Para ser capaz de 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 slaves Slink, como: ABCDEFGHIJKLMNABCDEFGHIJKLMN11 .

Editar: Cuidado, desde o Ubuntu 18 (talvez 17 também), a pia combinada tende a se tornar o dispositivo de saída do sistema padrão, em vez do dispositivo de saída real. Então, quando você altera o volume usando o ícone de som na bandeja do sistema, ele afeta seu som de registro. Solução alternativa: Depois de criar a pia combinada, abra $ 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 2 na guia Saída. Selecione "Exibir: Dispositivos de Saída Virtual" e redefinir o volume de som do dissipador combinado para 100%. Em seguida, selecione "Visualizar: Dispositivos de saída de hardware" e pressione o ícone verde "Definir como alternativa" no dispositivo de saída real.

 

Improving Waschtl answer of this thread so you can BOTH LISTEN AND RECORD the app sound:

First, we look for our default output and put its sink name 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 

Then, we create a combined sink that has only one slave: $DEFAULT_OUTPUT. The sound generated by the app (source) will be forwarded to the slave sink (ie. real output), and we'll also record it. It is different than a null sink where the source sound is not forwarded.

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

sink_properties is optional and may bug if you use spaces in the description name.

Then, we could use pactl move-sink-input ... command of Waschtl answer (with record-n-play instead of steam) but GUI pavucontrol is more simple (and great for checking/troubleshooting):

$ sudo apt-get install pavucontrol $ pavucontrol & 

Then, we play some sound in the app we want to record. In pavucontrol Playback tab, we select in the app dropdown list: "Record-and-Play".

Finally, we're good to record and listen at the same time! (lame mp3 example, run in foreground)

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

Or we can record in background and stop at any time:

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

  • To unmess everything or retry the procedure: Delete or reset the sinks by using this answer. pulseaudio -k works great to reset everything to session's defaults.
  • If we change the default output in the System Sound Settings, the custom app Playback setting will be overwritten and we will have to go back in pavucontrol to set it back to the combined interface.
  • To be able to listen to the sound from several "real" interfaces (eg headphones, HDMI output, etc...), we should include all "real" outputs that we may use to listen, as record-n-play slink slaves, like: pactl load-module module-combine-sink sink_name=record-n-play slaves=real-output-1,real-output-2.

EDIT: Beware, since Ubuntu 18 (maybe 17 too), the combined sink tends to become the default system output device, instead of the real output device. So when you change the volume using the sound icon in the system tray it impacts your record sound. Workaround: After creating the combined sink, open pavucontrol in Output tab. Select "View: Virtual Output Devices" and reset the sound volume of the combined sink to 100%. Then select "View: Hardware Output Devices" and press the green icon "Define as alternative" on the real output device.

 
 
 
 
10
 
vote

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

Instalar e executar o $ 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 3 gui. Você deve ver seu aplicativo de saída de áudio e seu medidor de volume sob a guia reprodução lá. Haverá um botão ao lado mostrando que está jogando em NULL EUROPA . Clique nele e altere-o na sua saída de áudio comum, estéreo analógico de áudio integrado no meu caso.

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

screenshot

Você também pode usar essa abordagem para configurar sua gravação no futuro, depois de executar o comando abcdefghgjklmnabcdefghjklmn14 na resposta de Waschtl para criar a pia.

 

@Waschtl's answer is fantastic. @ixtmixilix asked about restoring regular audio after the recording is finished. Here's the easiest way I know of:

Install and run the pavucontrol GUI. You should see your audio-outputting application and it's volume meter under the Playback tab in there. There will be a button next to it showing that it's playing on Null Output. Click on that and change it to your ordinary audio output, Built-in Audio Analog Stereo in my case.

Here's a screenshot of what you're looking for:

screenshot

You can also use this approach to set up your recording in the future, after you've run the load-module command in @Waschtl's answer to create the sink.

 
 
   
   
7
 
vote

Melhorando KriswebDev 's Resposta Além disso, se você quiser que o registro N-Play esteja sempre disponível, descubra pela primeira vez A saída padrão:

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

que vai 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 com qualquer saída que você obtém do comando pacmd . O pulso 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, o Pulseaudio ainda carrega a configuração padrão primeiro.

Executar pulseaudio -k para matar a instância atual do pulsoseaudio, de modo que um novo é iniciado com a nova configuração.

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

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

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

Para programas que o PulseAudio já possui informações armazenadas, lembra qualquer dispositivo de saída que usaram por último, para que você precise reconfigurar manualmente aqueles que usam um dos métodos descritos na resposta de Kriswebdev.

 

Improving KrisWebDev's answer further, if you want record-n-play to always be available, first find out the default output:

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

which will output something like:

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

Next, create a 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" 

Please replace alsa_output.pci-0000_00_1b.0.analog-stereo with whatever output you got from the pacmd command. Pulse does not read the default config file when a custom config file exists - that's why the first line above includes the default config file. That way pulseaudio still loads the default config first.

Run pulseaudio -k to kill the current pulseaudio instance so a new one is started with the new configuration.

If at any time you want to undo the changes here, just remove the ~/.config/pulse/default.pa file and run pulseaudio -k.

If you want the record-n-play to be the default sink for all outputs, you can do that by adding yet another line to the end of ~/.config/pulse/default.pa:

set-default-sink record-n-play 

For programs that pulseaudio already has stored information on, it remembers whatever output device they used last, so you'll have to manually reconfigure those using one of the methods described in KrisWebDev's answer.

 
 
5
 
vote

Eu criei este script bash com base nas respostas fornecidas por @waschtl e @kriswebdev respostas.

Disponível aqui: https://gist.github.com/ramast/4be3314bc73f28f55e3604497188b007

Como usar?

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

nova versão

Eu criei um script Python que ofereça algumas melhorias no antigo. https://gist.github.com/ramast/c47bd5e57586e9c2deb74975e27089f0

Como usar?

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

Quando você pressionar ENTER, a gravação será iniciada imediatamente. Se no momento em que você pressionar o aplicativo já foi parado (i.e você fechou o MPlayer, por exemplo), o script aguardará até que o aplicativo apareça novamente e inicie a gravação.

O único delineamento de volta para esse script (vs original) é que, se a lista contiver duas entradas com o mesmo nome, o script não se comportará corretamente. Por exemplo

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

editar: este é um versão melhorada do roteiro por @anararcat

Uso:

Para produzir gravação de OGG

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

Para produzir gravação de mp3

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

 

I've created this bash script based on the answers provided by @Waschtl and @KrisWebDev answers.

Available here: https://gist.github.com/ramast/4be3314bc73f28f55e3604497188b007

How to use?

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

New version

I've created a python script that offer some improvements over the old one. https://gist.github.com/ramast/c47bd5e57586e9c2deb74975e27089f0

How to use?

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

When you press enter the recording will start immediately. if by the time you hit enter the application was already stopped (i.e you closed mplayer for example) the script will wait until the app appear again and start recording.

The only draw back to that script (vs original one) is that if the list contain two entries with same name, the script won't behave correctly. For example

$ ./pulse-recorder.py                                                                                                        1 - ALSA plug-in [mplayer] 2 - ALSA plug-in [mplayer] 

Edit: This is an improved version of the script by @anarcat

Usage:

To produce ogg recording

./pulse-recorder.py -i -o 'test.ogg'

To produce mp3 recording

./pulse-recorder.py -i --encoder "lame -r -q 3 --lowpass 17 --abr 192 - '%s'" -o 'test.mp3'

 
 
     
     
1
 
vote

Se um único programa estiver emitindo som, você pode usar este bash one-liner:

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

Saída parece ser de cerca de 10 MB por minuto, e não muda o programa!

Eu acredito que esta seja uma boa solução, pois não baixei um novo script, e não tenho que criar uma nova pia nula no PulseAudio. Ele deve dar resultados estranhos se o programa não tiver saída de áudio quando o revestimento de uma única for iniciado ou se vários programas estiverem em saída de áudio quando o comando for iniciado.

parec deve parar de gravar quando terminar com o aplicativo que está jogando áudio. Alguns aplicativos de edição podem ter problemas com um arquivo AIFF que são 600 minutos, se tentarem carregá-lo em RAM duas vezes.

Esta é também uma solução ruim se o aplicativo parar e iniciar a saída de áudio.

 

If a single program is outputting sound you can use this bash one-liner:

parec --monitor-stream  $(pacmd list-sink-inputs|tac|perl -E'undef$/;$_=<>;/RUNNING.*?index: (\d+)\n/s;say $1') --format=s16le --channels=2 --file-format=aiff newrecording.aiff 

Output seems to be about 10MB per minute, and don't mute the program!

I believe this to be a good solution as I don't download a new script, and I don't have to create a new null sink in pulseaudio. It should give odd results if the program has no audio-output when the one-liner starts, or if multiple programs are outputting audio when the command starts.

parec should stop recording when you are done with the application that's playing audio. Some editing applications might have trouble with a aiff file that's 600 minutes long though, if they try and load it into RAM twice.

This is also a poor solution if the application stops and starts outputting audio.

 
 

Perguntas relacionadas

5  Qual é a melhor maneira de gravar áudio no meu desktop?  ( What is the best way to record audio into my desktop ) 
Eu perguntei ontem sobre como configurar o Audacity, que eu descobri não funciona bem com o Pulse Audio. Desde então, removi-los e estou procurando a melhor m...

4  Como digitalizar registros vinil antigos? [fechado]  ( How to digitize old vinyl records ) 
. fechado . Esta questão precisa ser mais focado . Atualmente não está aceitando respostas. ...

1  Gravação do SoundCard Ubuntu 11.04  ( Recording from soundcard ubuntu 11 04 ) 
Eu troquei do ambiente de desktop do painel GNOME para XFCE recentemente, e acabei de perceber que não posso mais gravar som usando a linha de comando do Puls...

2  Gravação da câmera lenovo fácil com ffmpeg - immelerate muito baixo  ( Recording lenovo easy camera with ffmpeg framerate too low ) 
Alguém tem uma cola porque eu não posso obter ffmpeg gravar minha webcam superior a 8 fps, com ffmpeg? Eu tentei queijo e guvcview, sob várias configurações. ...

8  Como configurar o Ubuntu PC como fone de ouvido Bluetooth para participar de chamadas  ( How to set up ubuntu pc as bluetooth headset to attend calls ) 
Estou tentando usar um fone de ouvido Bluetooth em um PC do Ubuntu. Eu sou capaz de conectar o telefone ao PC via BT. Eu posso transmitir música para o PC. Ma...

132  Como gravar a saída para os alto-falantes?  ( How to record output to speakers ) 
Existe um programa para o Ubuntu que pode gravar sons de apenas a saída do alto-falante e não quaisquer vozes de fora do PC? ...

21  Como dividir um arquivo MP3 detectando partes silenciosas?  ( How to split an mp3 file by detecting silent parts ) 
Eu tenho um grande arquivo MP3 incluindo mais músicas. Existe alguma maneira de dividir o arquivo detectando partes silenciosas? Eu preferiria uma ferramenta ...

1  Gravação agendada FFMPEG 14.04 com temporizador  ( Scheduled recording ffmpeg 14 04 with timer ) 
Como faço para configurar uma gravação agendada que pára após um tempo definido com som e vídeo em 14.04? Eu quero gravar algo 6 horas à frente que dura 1 hor...

21  Use o telefone como microfone no Linux  ( Use phone as microphone in linux ) 
Eu tenho janelas de inicialização dupla e Ubuntu. Como não uso nenhum microfone na minha área de trabalho, comecei a usar um aplicativo chamado "Wo Mic" para ...

2  O som gravado do microfone é muito rápido  ( The recorded sound from microphone is very fast ) 
Eu estou usando o Kazam para gravar vídeos. Mas quando vejo o vídeo, percebo que o som gravado é muito mais rápido do que eu falo (como 10s voltou para 2s). E...




© 2022 pergunte.org All Rights Reserved. Casa de perguntas e respostas todos os direitos reservados


Licensed under cc by-sa 3.0 with attribution required.