Запишіть вихід програми з 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 -

Пояснення:

  • Перша команда додасть нульову точку, як ви вже знали.
  • Друга команда переміщує вхід мийки з вашого стандартного аудіо-мийки на пару
  • Третя команда записує монітор пари пристрою (-d) і передає вихід (сировинна хвиля-потік) в oggenc, який кодує цей хвильовий потік в oga-файл. (для mp3 використання кульгавого)

Блискуче, дуже дякую за цю чудову відповідь! :)
Форс

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 (із записом n-play замість пари ), але 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

Примітка:

  • Щоб зняти з ладу все або спробувати процедуру: Видаліть або скиньте раковини за допомогою цієї відповіді . pulseaudio -kчудово працює, щоб скинути все до значень за замовчуванням сеансу.
  • Якщо ми змінимо вихід за замовчуванням у Налаштуваннях системного звуку, налаштування відтворення користувальницької програми буде перезаписана, і нам доведеться повернутися в pavucontrol, щоб повернути його до комбінованого інтерфейсу.
  • Щоб мати можливість слухати звук з декількох "реальних" інтерфейсів (наприклад, навушники, вихід HDMI та ін.), Ми повинні включати всі "реальні" виходи, які ми можемо використовувати для прослуховування, як записуючі раби на записі n-play , як: pactl load-module module-combine-sink sink_name=record-n-play slaves=real-output-1,real-output-2.

EDIT: Остерігайтеся, оскільки Ubuntu 18 (можливо, теж 17) комбінована раковина, як правило, стає пристроєм виводу системи за замовчуванням замість реального пристрою виводу. Тож коли ви змінюєте гучність за допомогою значка звуку в системному треї, це впливає на звук запису. Обхід: Після створення комбінованої раковини відкрийте pavucontrolна вкладці Вихід. Виберіть "Перегляд: віртуальні пристрої виводу" і скиньте гучність звуку комбінованої раковини до 100%. Потім виберіть "Переглянути: пристрої виведення обладнання" та натисніть зелений значок "Визначити як альтернативу" на реальному пристрої виводу.


9

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

Встановіть та запустіть pavucontrolграфічний інтерфейс. Ви повинні побачити свою програму аудіо-виведення, і це вимірювач гучності під Playbackвкладкою там. Поруч буде кнопка, яка показує, що вона грає на Null Output . Клацніть на цьому і змініть його на звичайний аудіо вихід, в моєму випадку вбудований аудіо аналоговий стерео .

Ось скріншот того, що ви шукаєте:

скріншот

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

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

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

Якщо ви хочете, щоб запис-n-play був мийкою за замовчуванням для всіх виходів, ви можете зробити це, додавши ще один рядок до кінця ~/.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

Після натискання клавіші введення запис розпочнеться негайно. якщо до моменту натискання клавіші введення програма вже була зупинена (тобто, наприклад, ви закрили 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-stereo, де це відбувається з виводу списку pacmd -sinks
smaudet
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.