Rekam keluaran program dengan PulseAudio

49

Saya ingin merekam output dari program dengan PulseAudio menggunakan command line / bash script. Penting untuk tidak mencatat semua output, tetapi hanya output dari satu program tertentu.

Saya pikir saya harus membuat null-sink baru dan daripada memindahkan output program ke sink baru ini. Daripada memberitahu parec untuk menggunakan monitor khusus ini untuk merekam.

Langkah pertama akan menjadi seperti ini:

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

Tetapi bagaimana cara memindahkan output program sekarang ke sink ini?
Dan bagaimana cara merekam wastafel tertentu dengan skrip bash?

pengguna5950
sumber

Jawaban:

52

Coba sesuatu seperti ini:

Masuk terminal

pacmd

(ini adalah CLI dari PulseAudio-Server) kemudian gunakan

list-sink-inputs

(di mana Anda mendapatkan indeks dari input yang berjalan) Sekarang temukan indeks dari input Anda. Sekarang disebut sebagai $ INDEX

bagian skrip adalah:

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 -

Penjelasan:

  • Perintah pertama akan menambahkan null-sink seperti yang sudah Anda ketahui.
  • Perintah kedua menggerakkan input wastafel dari wastafel audio standar ke uap
  • Perintah ketiga merekam monitor steam perangkat (-d) dan menempatkan output (raw-wave-stream) ke dalam oggenc, yang menyandikan stream-stream ini ke file oga. (untuk mp3 gunakan lumpuh)
Waschtl
sumber
Cemerlang, terima kasih banyak atas jawaban yang bagus ini! :)
Angkatan
2
dapatkah Anda menjelaskan cara membatalkan operasi ini? null sinks saya masih dipetakan ke berbagai aplikasi, dan sekarang saya tidak memiliki suara!
ixtmixilix
@ixtmixilix: cara termudah untuk mengembalikan semua pengaturan ke default adalah dengan hanya membunuh dan me-restart server pulseaudio. Jika diatur ke autospawn (ini adalah default) Anda cukup mengeluarkan pulseaudio -kdi terminal.
Takkat
1
@ixtmixilix Saat Anda menjalankan list-sink-inputsperhatikan sinknilainya. Untuk swap kembali jalankan saja pactl move-sink-input $INDEX $SINK. Sesuatu sepertipactl move-sink-input 4719 1
Ciaran
27

Meningkatkan jawaban Waschtl dari utas ini sehingga Anda dapat KEDUA MENDENGARKAN DAN MENCATAKAN aplikasi terdengar:

Pertama, kami mencari output default kami dan memasukkan nama wastafelnya ke $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

Lalu, kami membuat wastafel gabungan yang hanya memiliki satu budak: $ DEFAULT_OUTPUT . Suara yang dihasilkan oleh aplikasi (sumber) akan diteruskan ke slave sink (mis. Output nyata), dan kami juga akan merekamnya. Ini berbeda dari wastafel nol di mana suara sumber tidak diteruskan.

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

sink_properties adalah opsional dan mungkin bug jika Anda menggunakan spasi dalam nama deskripsi.

Kemudian, kita bisa menggunakan pactl move-sink-input ...perintah Waschtl answer (dengan record-n-play alih - alih steam ) tetapi GUI pavucontrollebih sederhana (dan bagus untuk memeriksa / mengatasi masalah):

$ sudo apt-get install pavucontrol
$ pavucontrol &

Kemudian, kami memutar beberapa suara di aplikasi yang ingin kami rekam. Di pavucontrol Playbacktab, kami memilih dalam daftar dropdown aplikasi: "Rekam dan Mainkan" .

Akhirnya, kami senang merekam dan mendengarkan pada saat yang sama! ( Contoh mp3 lumpuh , jalankan di latar depan)

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

Atau kami dapat merekam di latar belakang dan berhenti kapan saja:

$ 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:

  • Untuk melepas semua atau mencoba kembali prosedur: Hapus atau setel ulang sink dengan menggunakan jawaban ini . pulseaudio -kbekerja sangat baik untuk mengatur ulang semuanya ke default sesi.
  • Jika kita mengubah output default di System Sound Settings, pengaturan Playback aplikasi khusus akan ditimpa dan kita harus kembali di pavucontrol untuk mengembalikannya ke antarmuka gabungan.
  • Untuk dapat mendengarkan suara dari beberapa antarmuka "nyata" (mis. Headphone, output HDMI, dll ...), kita harus menyertakan semua output "nyata" yang dapat kita gunakan untuk mendengarkan, sebagai slink slave record-n-play slink , seperti: pactl load-module module-combine-sink sink_name=record-n-play slaves=real-output-1,real-output-2.

EDIT: Hati-hati, karena Ubuntu 18 (mungkin 17 juga), wastafel gabungan cenderung menjadi perangkat output sistem default, bukan perangkat output nyata. Jadi ketika Anda mengubah volume menggunakan ikon suara di baki sistem, hal itu memengaruhi suara rekaman Anda. Penanganan Masalah: Setelah membuat wastafel gabungan, buka pavucontroldi tab Output. Pilih "View: Virtual Output Devices" dan atur ulang volume suara sink gabungan menjadi 100%. Kemudian pilih "Lihat: Perangkat Output Perangkat Keras" dan tekan ikon hijau "Tentukan sebagai alternatif" pada perangkat output nyata.

KrisWebDev
sumber
9

Jawaban @ Waschtl sangat fantastis. @ixtmixilix bertanya tentang memulihkan audio biasa setelah rekaman selesai. Inilah cara termudah yang saya ketahui:

Instal dan jalankan pavucontrolGUI. Anda akan melihat aplikasi keluaran audio Anda dan pengukur volume di bawah Playbacktab di sana. Akan ada tombol di sebelahnya yang menunjukkan bahwa ia diputar di Null Output . Klik itu dan ubah ke output audio biasa, Stereo Audio Analog Bawaan dalam kasus saya.

Berikut screenshot dari apa yang Anda cari:

tangkapan layar

Anda juga dapat menggunakan pendekatan ini untuk mengatur rekaman Anda di masa mendatang, setelah Anda menjalankan load-moduleperintah di jawaban @ Waschtl untuk membuat wastafel.

Jack O'Connor
sumber
Jika Anda bisa, unggah tangkapan layar di Imgur dan tautkan ke jawaban Anda.
Lucio
Saya tidak tahu apakah itu layak, tapi saya pikir cara terbaik adalah membongkar modul keluaran nol, sehingga pemutaran baru tidak mengambilnya secara default
Jack
6

Meningkatkan jawaban KrisWebDev lebih lanjut, jika Anda ingin record-n-play selalu tersedia, pertama-tama cari tahu output default:

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

yang akan menampilkan sesuatu seperti:

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

Selanjutnya, buat file ~/.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"

Silakan ganti alsa_output.pci-0000_00_1b.0.analog-stereodengan output apa pun yang Anda dapatkan dari pacmdperintah. Pulse tidak membaca file konfigurasi default ketika ada file konfigurasi kustom - itu sebabnya baris pertama di atas menyertakan file konfigurasi default. Dengan cara itu pulseaudio masih memuat konfigurasi default terlebih dahulu.

Jalankan pulseaudio -kuntuk membunuh instance pulseaudio saat ini sehingga yang baru dimulai dengan konfigurasi baru.

Jika suatu saat Anda ingin membatalkan perubahan di sini, hapus saja ~/.config/pulse/default.pafile tersebut dan jalankan pulseaudio -k.

Jika Anda ingin record-n-play menjadi bak penampung default untuk semua keluaran, Anda bisa melakukannya dengan menambahkan satu baris lagi ke akhir ~/.config/pulse/default.pa:

set-default-sink record-n-play

Untuk program yang pulseaudio telah menyimpan informasi, ia mengingat perangkat keluaran apa pun yang mereka gunakan terakhir, jadi Anda harus mengkonfigurasi ulang secara manual mereka menggunakan salah satu metode yang dijelaskan dalam jawaban KrisWebDev.

Jonas Berlin
sumber
2

Saya telah membuat skrip bash ini berdasarkan jawaban yang diberikan oleh @Waschtl dan jawaban @KrisWebDev.

Tersedia di sini: https://gist.github.com/ramast/4be3314bc73f28f55e3604497188b007

Cara Penggunaan?

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

Versi baru

Saya telah membuat skrip python yang menawarkan beberapa perbaikan dibandingkan yang lama. https://gist.github.com/ramast/c47bd5e57586e9c2deb74975e27089f0

Cara Penggunaan?

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

Ketika Anda menekan enter, rekaman akan segera dimulai. jika pada saat Anda menekan enter aplikasi sudah berhenti (misalnya Anda menutup mplayer) skrip akan menunggu sampai aplikasi muncul lagi dan mulai merekam.

Satu-satunya menarik kembali ke skrip itu (vs yang asli) adalah bahwa jika daftar berisi dua entri dengan nama yang sama, skrip tidak akan berperilaku dengan benar. Sebagai contoh

$ ./pulse-recorder.py                                                                                                      

1 - ALSA plug-in [mplayer]
2 - ALSA plug-in [mplayer]
Ramast
sumber
Jika Anda memiliki banyak keluaran (mis. Speaker, beberapa headset, monitor audio), Anda dapat mengganti on line 21 dengan misalnya: default_output = alsa_output.pci-0000_00_1b.0.analog-stereo di mana ini berasal dari output daftar pacmd -sinks
smaudet