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


49

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

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

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

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

Но как теперь перенести вывод программы в этот приемник?
А как записать конкретный сток с помощью bash-скрипта?

Ответы:


52

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

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

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 -

Пояснения:

  • Первая команда добавит нулевой сток, как вы уже знали.
  • Вторая команда перемещает вход-приемник из стандартного аудио-приемника в steam
  • Третья команда записывает монитор устройства steam (-d) и помещает вывод (raw-wave-stream) в oggenc, который кодирует этот волновой поток в oga-файл. (для mp3 используйте lame)

Бриллиант, большое спасибо за этот отличный ответ! :)
Force

2
не могли бы вы объяснить, как отменить эту операцию? мои нулевые приемники по-прежнему отображаются в различных приложениях, и теперь у меня нет звука!
ixtmixilix

@ixtmixilix: самый простой способ восстановить все настройки по умолчанию - просто убить и перезапустить сервер pulseaudio. Если установлено автоматическое порождение (это значение по умолчанию), вы просто выдаете pulseaudio -kв терминале.
Таккат

1
@ixtmixilix При запуске list-sink-inputsобратите внимание на sinkзначение. Чтобы поменять местами, просто беги pactl move-sink-input $INDEX $SINK. Нечто подобноеpactl move-sink-input 4719 1
Ciaran

27

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

$ sudo apt-get install pavucontrol
$ pavucontrol &

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

Наконец, мы хороши для записи и прослушивания одновременно! ( пример с хромой 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прекрасно работает, чтобы сбросить все к значениям по умолчанию сеанса.
  • Если мы изменим вывод по умолчанию в System Sound Settings, пользовательские настройки воспроизведения приложения будут перезаписаны, и нам придется вернуться в pavucontrol, чтобы вернуть его к комбинированному интерфейсу.
  • Чтобы иметь возможность прослушивать звук с нескольких «реальных» интерфейсов (например, наушников, выхода HDMI и т. Д.), Мы должны включить все «реальные» выходы, которые мы можем использовать для прослушивания, в качестве подчиненных устройств записи-воспроизведения-воспроизведения. , например: pactl load-module module-combine-sink sink_name=record-n-play slaves=real-output-1,real-output-2.

РЕДАКТИРОВАТЬ: Остерегайтесь, начиная с Ubuntu 18 (может быть 17 тоже), комбинированный приемник, как правило, становится устройством вывода системы по умолчанию, а не реальным устройством вывода. Поэтому, когда вы меняете громкость с помощью значка звука на панели задач, это влияет на звук записи. Обходной путь: После создания комбинированного приемника откройте pavucontrolвкладку «Вывод». Выберите «View: Virtual Output Devices» и сбросьте громкость звука объединенного приемника до 100%. Затем выберите «View: Аппаратные устройства вывода» и нажмите зеленый значок «Определить как альтернативу» на реальном устройстве вывода.


9

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

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

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

Скриншот

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


Если можете, загрузите снимок экрана в Imgur и привяжите его к ответу.
Лусио

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

6

Для дальнейшего улучшения ответа 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.

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

set-default-sink record-n-play

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


2

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

Доступно здесь: 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, запись начнется немедленно. Если к тому времени, когда вы нажмете Enter, приложение уже будет остановлено (например, вы закрыли mplayer), сценарий будет ждать, пока приложение снова не появится, и начать запись.

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

$ ./pulse-recorder.py                                                                                                      

1 - ALSA plug-in [mplayer]
2 - ALSA plug-in [mplayer]

В случае, если у вас есть несколько выходов (например, колонки, несколько гарнитур, монитор звука), вы можете заменить в строке 21, например: default_output = alsa_output.pci-0000_00_1b.0.analog-стерео, где это из вывода списка pacmd Раковины
Смодет
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.