Записать выход программы с помощью PulseAudio

41

Я хочу записать вывод программы с помощью PulseAudio с помощью сценария командной строки / bash. Важно не записывать весь вывод, а только вывод из одной конкретной программы.

Я думал, что мне нужно будет создать новую нулевую раковину, а затем переместить вывод этой новой раковины. Затем скажите parec использовать этот конкретный монитор для записи.

Первый шаг будет примерно таким:

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

Но как перенести вывод программы на эту раковину?
И как записать конкретную раковину с помощью сценария bash?

    
задан user5950 10.09.2011 в 17:49
источник

5 ответов

45

Попробуйте что-то вроде этого:

В терминале введите

pacmd

(это CLI для PulseAudio-Server) затем используйте

list-sink-inputs

(где вы получаете индексы запущенных входов) Теперь найдите индекс вашего ввода. Теперь называется $ INDEX

для скриптовой части:

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 -

Пояснение:

  • Первая команда добавит нулевой приемник, как вы уже знали.
  • Вторая команда перемещает приемник-приемник с вашего стандартного аудио-приемника на пар
  • Третья команда записывает монитор пара устройства (-d) и помещает вывод (raw-wave-stream) в oggenc, который кодирует этот волновой поток в oga-файл. (для использования в латекс)
ответ дан Waschtl 10.09.2011 в 20:10
источник
16

Улучшение ответа Waschtl в этом потоке, чтобы вы могли ОБА СЛУШАТЬ И ЗАПИСЬ звук приложения

Во-первых, мы ищем выход по умолчанию и помещаем его имя стека в $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

Затем мы создаем объединенный приемник , который имеет только один подчиненный : $ DEFAULT_OUTPUT . Звук, создаваемый приложением (источником), будет перенаправлен на подчиненный приемник (т. Е. Реальный вывод), и мы также запишем его. Он отличается от пустой раковины , где исходный звук не перенаправляется.

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

sink_properties является необязательным и может быть ошибкой, если вы используете пробелы в имени описания.

Затем мы могли бы использовать команду pactl move-sink-input ... Ответ Waschtl (с помощью record-n-play вместо steam ), но GUI pavucontrol более прост (и отлично подходит для проверки / устранения неполадок):

$ sudo apt-get install pavucontrol
$ pavucontrol &

Затем мы воспроизводим звук в приложении, которое хотим записать. В вкладке pavucontrol Playback мы выбираем в раскрывающемся списке приложений: «Запись и воспроизведение» .

Наконец, мы умеем записывать и слушать в одно и то же время! ( lame mp3-пример, запустите на переднем плане)

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

Или мы можем записывать в фоновом режиме и останавливаться в любое время:

$ 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

Примечание:

  • Чтобы отменить все или повторить процедуру: Удалите или перезагрузите приемники, используя этот ответ . pulseaudio -k отлично работает, чтобы сбросить все настройки по умолчанию.
  • Если мы изменим вывод по умолчанию в настройках System Sound, пользовательское приложение Playback будет перезаписано, и нам нужно будет вернуться в pavucontrol, чтобы вернуть его в комбинированный интерфейс.
  • Чтобы слушать звук с нескольких «реальных» интерфейсов (например, наушников, выход HDMI и т. д.), мы должны включать все «реальные» выходы, которые мы можем использовать для прослушивания, в качестве записи -n-play slink slaves, например: pactl load-module module-combine-sink sink_name=record-n-play slaves=real-output-1,real-output-2 .
ответ дан KrisWebDev 24.01.2016 в 11:41
7

@ Ответ Waschtl фантастический. @ixtmixilix спросила о восстановлении обычного звука после завершения записи. Вот самый простой способ узнать:

Установите и запустите графический интерфейс pavucontrol . Вы должны увидеть свое приложение для вывода аудио и его метр объема на вкладке Playback . Рядом с ним появится кнопка, показывающая, что она воспроизводится на Null Output . Нажмите на это и измените его на обычный аудиовыход, Встроенный аудио аналоговый стерео в моем случае.

Вот скриншот того, что вы ищете:

Вы также можете использовать этот подход для настройки своей записи в будущем, после того как вы запустили команду load-module в ответе @ Waschtl для создания приемника.

    
ответ дан Jack O'Connor 02.03.2013 в 19:02
5

Улучшение ответа KrisWebDev , если вы хотите, чтобы запись-n-play всегда была доступна, сначала узнайте выход по умолчанию:

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

, который выведет что-то вроде:

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

Затем создайте файл ~/.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"

Пожалуйста, замените alsa_output.pci-0000_00_1b.0.analog-stereo на любой результат, полученный вами из команды pacmd . Pulse не считывает конфигурационный файл по умолчанию, когда существует настраиваемый файл конфигурации, поэтому первая строка выше содержит файл конфигурации по умолчанию. Таким образом, pulseaudio по-прежнему загружает конфигурацию по умолчанию.

Запустите pulseaudio -k , чтобы убить текущий экземпляр pulseaudio, чтобы новый был запущен с новой конфигурацией.

Если в любой момент вы хотите отменить изменения здесь, просто удалите файл ~/.config/pulse/default.pa и запустите pulseaudio -k .

Если вы хотите, чтобы record-n-play был приемником по умолчанию для всех выходов, вы можете сделать это, добавив еще одну строку в конец ~/.config/pulse/default.pa :

set-default-sink record-n-play

Для программ, на которые уже записана информация о пульсирующей музыке, она запоминает, какое устройство вывода использовалось последним, поэтому вам придется вручную перенастроить их, используя один из методов, описанных в ответе KrisWebDev.

    
ответ дан Jonas Berlin 19.07.2016 в 10:56
2

Я создал этот скрипт bash на основе ответов, предоставленных ответами @Waschtl и @KrisWebDev.

Доступно здесь: Ссылка

Как использовать?

$ ./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
    
ответ дан Ramast 01.05.2017 в 21:10