Записать вывод программы с PulseAudio
Я хотел бы записать вывод программы с PulseAudio, используя командную строку / сценарий bash. Важно не записывать все выходные данные, а только выходные данные одной конкретной программы.
Я думал, что мне нужно будет создать новый нулевой приемник и затем перенести вывод программы в этот новый приемник. Чем сказать Parec, чтобы использовать этот конкретный монитор для записи.
Первый шаг будет примерно таким:
pactl load-module module-null-sink sink_name=steam
Но как теперь перенести вывод программы в этот приемник?
А как записать конкретный сток с помощью bash-скрипта?
8 ответов
Попробуйте что-то вроде этого:
В терминале введите
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)
Улучшение ответа 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), но с графическим интерфейсом 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
прекрасно работает, чтобы сбросить все к значениям по умолчанию сеанса. - Если мы изменим вывод по умолчанию в 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: Аппаратные устройства вывода" и нажмите зеленый значок "Определить как альтернативу" на реальном устройстве вывода.
@ Ответ Waschtl фантастический. @ixtmixilix спросил о восстановлении обычного звука после завершения записи. Вот самый простой способ, который я знаю:
Установите и запустите pavucontrol
GUI. Вы должны увидеть свое приложение для вывода звука и его измеритель громкости на вкладке " Воспроизведение ". Рядом с ним будет кнопка, показывающая, что он играет на нулевом выходе. Нажмите на это и измените его на ваш обычный аудио выход, встроенный аудио аналоговый стерео в моем случае.
Вот скриншот того, что вы ищете:
Вы также можете использовать этот подход для настройки записи в будущем, после того как вы запустите load-module
команда в ответе @Waschtl, чтобы создать раковину.
Для дальнейшего улучшения ответа 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
,
Если вы хотите, чтобы запись-н-воспроизведение была приемником по умолчанию для всех выходов, вы можете сделать это, добавив еще одну строку в конец ~/.config/pulse/default.pa
:
set-default-sink record-n-play
Для программ, в которых pulseaudio уже хранит информацию, он запоминает все устройства вывода, которые они использовали последними, поэтому вам придется вручную перенастроить их, используя один из методов, описанных в ответе KrisWebDev.
Я создал этот 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
Если одна программа выводит звук, вы можете использовать этот однострочник 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 минут, если они дважды попытаются загрузить его в ОЗУ.
Это также плохое решение, если приложение останавливается и начинает вывод звука.
Все эти ответы удивительны и демонстрируют мощь PulseAudio! Копаясь, чтобы попытаться понять их, я нашел более простое решение (возможно, это новая функция): мы можем напрямую подключиться к монитору вывода по умолчанию.
DEFAULT_OUTPUT=$(pacmd list-sinks | grep -A1 "* index" | grep -oP "<\K[^ >]+") # From previous answer
ffmpeg -f pulse -ac 2 -i $DEFAULT_OUTPUT.monitor output.mp3
Прекрасно работает, если вы также хотите снимать видео.
Одно небольшое улучшение решений здесь. Во-первых, проблема: вам может понадобиться настроить громкость воспроизведения (монитора) приложения во время прослушивания другого аудио, но не громкости записи. Module-null-sink работает, если вывод не нужен, но что, если он нужен или его нужно контролировать на лету?
Проблема в том, что PulseAudio не позволяет отдельно настраивать одиночный "ведомый" или выводить отдельно от стоковой громкости. Другими словами, вы можете настроить приложение (что повлияет на все ниже в цепочке, так что это нехорошо) или приемник, к которому было подключено приложение, но конечным результатом в обоих случаях будет то, что громкость воспроизведения и записи будет одинаковой. затронуты - независимо от того, подключается ли записывающее программное обеспечение к приложению или приемнику.
Одно из решений: нам нужно добавить в цепочку хотя бы еще один приемник.
Решение:
SLAVE_FOR_PLAYBACK=alsa_output.pci-0000_2f_00.4.iec958-stereo
VOLCTRL_SINK_NAME=rec-mon-vol
RECMON_SINK_NAME=rec-n-play
pacmd load-module module-combine-sink sink_name=$VOLCTRL_SINK_NAME slaves=$SLAVE_FOR_PLAYBACK sink_properties=device.description="Recording-Monitor-Volume"
pacmd load-module module-combine-sink sink_name=$RECMON_SINK_NAME slaves=$VOLCTRL_SINK_NAME sink_properties=device.description="Record-and-Monitor"
Решение здесь очевидное: добавить еще один сток в цепочку, чтобы позволить уменьшить громкость после шага записи, не влияя на запись. Т.е. простая схема для приведенной выше установки:
APP -> REC -> MON -> MASTER_SINK (speakers)
(\--->recording software)
Таким образом, мы можем регулировать громкость воспроизведения в
MON
отдельно от тома, поступающего на
REC
и другие приложения (музыка, голосовой чат и т. д.), подключенные к
MASTER_SINK
(=динамики).
Альтернативное решение:
Но если громкость REC была уменьшена, а хочется увеличить ее в MON, то будет потеряна некоторая битовая глубина (если я правильно догадываюсь, как работает PulseAudio). Следовательно, другим (возможно, более элегантным решением?) будет:
APP -> REC_AND_MONITOR ---> REC (---> recording software)
\--> MONITOR -> MASTER_SINK (speakers)
Но для этого нужна третья раковина. Но теперь громкость записи и воспроизведения можно действительно регулировать отдельно, не влияя друг на друга (первое решение хорошо работает только в том случае, если нужно только уменьшить громкость). Вот так:
pactl load-module module-null-sink sink_name=rec_monitor sink_properties=device.description="Recording_monitor_volume"
pactl load-module module-null-sink sink_name=rec sink_properties=device.description="Record_with_no_monitoring"
pactl load-module module-combine-sink sink_name=rec-n-monitor sink_properties=device.description="Record_with_monitoring" slaves=rec,rec_monitor
pactl load-module module-loopback source=rec_monitor.monitor sink=${SLAVE_FOR_PLAYBACK} latency_msec=${DESIRED_LATENCY}
Теперь подключите вывод ваших приложений к
rec-n-monitor
, записывающее программное обеспечение с и может регулировать громкость монитора, регулируя
rec_monitor
и громкость записи, регулируя
rec
.
Для задержки монитора установите
DESIRED_LATENCY
для всего, что вы хотите. Я использую 20 (единица измерения — мс). Конечно, реальная задержка зависит от вашей системы; также см. справочную страницу pactl. Есть и другие общие приемы для снижения задержки Pulseaudio, но это выходит за рамки этого вопроса...