Запишите вывод программы с PulseAudio

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

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

Первый шаг был бы чем-то вроде этого:

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

Но как переместить вывод программы теперь в этот приемник?
И как записать определенный приемник со сценарием удара?

49
задан 13 August 2017 в 11:16

6 ответов

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

В терминале входят

pacmd

(это - CLI PulseAudio-сервера), затем используют

list-sink-inputs

(где Вы добираетесь, индексы рабочих исходных данных) Теперь находят индекс Вашего входа. Теперь называемый $INDEX

scriptable часть:

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) и помещает вывод (необработанный волновой поток) в oggenc, который кодирует этот волновой поток в oga-файл. (поскольку mp3 используют Ламе),
52
ответ дан 22 November 2019 в 23:53

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

Установите и работайте pavucontrol GUI. Необходимо видеть производящее аудио приложение, и это - измеритель уровня громкости под вкладкой Playback там. Будет кнопка рядом с ним показывающий, что это играет на Пустом Выводе. Нажмите на это и измените его на свой обычный аудиовыход, Встроенный Аудио Аналоговый Стерео в моем случае.

Вот снимок экрана того, что Вы ищете:

screenshot

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

9
ответ дан 22 November 2019 в 23:53

Улучшение ответа 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 ... команда ответа Waschtlrecord-n-play вместо пара), но GUI pavucontrol является более простым (и большим для проверки/поиска и устранения неисправностей):

$ sudo apt-get install pavucontrol
$ pavucontrol &

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

Наконец, нас хорошо записать и послушать одновременно! (хромой 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

NB:

  • Не смешать все или повторить процедуру: Удалите или сбросьте приемники при помощи этого ответа. pulseaudio -k работает отлично для сброса всего к значениям по умолчанию сессии.
  • Если мы изменим вывод по умолчанию в Системных Настройках Звука, то Параметр воспроизведения пользовательского приложения будет перезаписан, и мы должны будем возвратиться в pavucontrol для задержки его к объединенному интерфейсу.
  • Чтобы смочь слушать звук от нескольких "реальных" интерфейсов (например, наушники, вывод HDMI, и т.д....), мы должны включать все "реальные" выводы, которые мы можем использовать для слушания, как record-n-play недоношенные ведомые устройства, как: pactl load-module module-combine-sink sink_name=record-n-play slaves=real-output-1,real-output-2.

Править: Остерегайтесь, начиная с Ubuntu 18 (возможно, 17 также), объединенный приемник имеет тенденцию становиться системным устройством вывода по умолчанию вместо реального устройства вывода. Таким образом, при изменении объема с помощью значка звука в системном лотке, он влияет рекордный звук. Обходное решение: После создания объединенного приемника, открытого pavucontrol на вкладке Output. Выберите "Представление: Виртуальные Устройства вывода" и сброс громкость звука объединенного приемника к 100%. Затем выберите "Представление: Аппаратные Устройства вывода" и нажатие зеленый значок "Define as alternative" на реальном устройстве вывода.

27
ответ дан 22 November 2019 в 23:53

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

Доступный здесь: https://gist.github.com/ramast/4be3314bc73f28f55e3604497188b007

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

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

Новая версия

Я создал сценарий Python, которые предлагают некоторые улучшения по сравнению со старым. https://gist.github.com/ramast/c47bd5e57586e9c2deb74975e27089f0

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

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

При нажатии Enter, запись сразу запустится. если к тому времени, когда Вы совершаете нападки, входят, приложение было уже остановлено (т.е. Вы закрыли mplayer, например), сценарий будет ожидать до приложения появляются снова и начинают записывать.

Единственные отступают к тому сценарию (по сравнению с исходным), то, что, если список содержит две записи с тем же именем, сценарий не будет вести себя правильно. Например,

$ ./pulse-recorder.py                                                                                                      

1 - ALSA plug-in [mplayer]
2 - ALSA plug-in [mplayer]
2
ответ дан 22 November 2019 в 23:53

Улучшение ответа KrisWebDev далее, если Вы хотите, чтобы record-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 команда. Импульс не читает файл конфигурации по умолчанию, когда пользовательский файл конфигурации существует - вот почему, первая строка выше включает файл конфигурации по умолчанию. Тот путь pulseaudio все еще загружает конфигурацию по умолчанию сначала.

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

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

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

set-default-sink record-n-play

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

6
ответ дан 22 November 2019 в 23:53

Если одна программа выводит звук, вы можете использовать эту однострочную команду bash:

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

Вывод составляет около 10 МБ в минуту, и не отключайте звук программы!

Я считаю, что это хорошее решение, так как я не загружаю новый скрипт и мне не нужно создавать новый нулевой приемник в pulseaudio. Это должно давать странные результаты, если программа не выводит звук при запуске однострочной команды или если несколько программ выводят звук при запуске команды.

parec должен остановить запись, когда вы закончите с приложением, которое воспроизводит звук. Однако у некоторых приложений для редактирования могут возникнуть проблемы с файлом aiff продолжительностью 600 минут, если они попытаются дважды загрузить его в ОЗУ.

Это также плохое решение, если приложение останавливается и начинает выводить звук.

6
ответ дан 19 September 2020 в 15:00

Другие вопросы по тегам:

Похожие вопросы: