PulseAudio ile bir programın çıktısını kaydedin


49

Komut satırı / bash betiği kullanarak PulseAudio ile bir programın çıktısını kaydetmek istiyorum . Tüm çıktıları kaydetmek değil, yalnızca belirli bir programdan gelen çıktıları kaydetmek önemlidir.

Yeni bir boş-lavabo oluşturmak zorunda kalacağımı ve programın çıktısını bu yeni lavaboya taşımam gerekeceğini düşündüm. Daha sonra parec'e kayıt için bu özel monitörü kullanmasını söyleyin .

İlk adım böyle bir şey olurdu:

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

Ancak programın çıktısını şimdi bu lavaboya nasıl aktarabilirim?
Ve belirli lavaboyu bir bash betiği ile nasıl kaydedersiniz?

Yanıtlar:


52

Böyle bir şey dene:

Bir terminalde girin

pacmd

(Bu PulseAudio-Server'ın CLI'sidir) kullanın

list-sink-inputs

(çalışan girişlerin indekslerini nereden alırsınız) Şimdi girişinizin indeksini bulun. Şimdi $ INDEX olarak anılıyor

komut dosyası kısmı:

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 -

açıklamalar:

  • İlk komut, bildiğiniz gibi bir boşalmak sağlayacaktır.
  • İkinci komut, lavabo girişini standart ses lavabonuzdan buhara geçirir
  • Üçüncü komut, cihaz buharının (-d) monitörünü kaydeder ve çıkışı (ham dalga akışı) bu dalga akışını bir oga dosyasına kodlayan oggenc'e koyar. (mp3 lame kullanmak için)

Harika, bu harika cevap için çok teşekkür ederim! :)
Kuvvet

2
Lütfen bu işlemin nasıl geri alınacağını açıklayabilir misiniz? boş lavabolarım hala çeşitli uygulamalarla eşleştiriliyor ve şimdi ses yok!
ixtmixilix

@ixtmixilix: tüm ayarları varsayılan ayarlara getirmenin en kolay yolu pulseaudio sunucusunu öldürmek ve yeniden başlatmak. Autospawn olarak ayarlanmışsa (bu varsayılandır) sadece pulseaudio -kbir terminalde sorun .
Takkat

1
@ixtmixilix Çalıştırdığınızda değeri list-sink-inputsnot alın sink. Geri dönmek için sadece koş pactl move-sink-input $INDEX $SINK. Gibi bir şeypactl move-sink-input 4719 1
Ciaran

27

Waschtl'ın bu konuya olan cevabını iyileştirmek , böylece uygulama sesini dinlemek ve kaydetmek için:

Öncelikle, varsayılan çıktımızı arıyoruz ve satır adını girdik $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

Ardından, yalnızca bir köle olan birleşik bir lavabo oluştururuz : $ DEFAULT_OUTPUT . Uygulama (kaynak) tarafından üretilen ses, bağımlı havuza (yani gerçek çıktı) iletilir ve ayrıca kaydederiz. Kaynak sesin iletilmediği boş bir havuzdan farklıdır .

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

sink_properties isteğe bağlı ve açıklama adında boşluk kullanıyorsanız hata verebilir.

Sonra Kullanabileceğimiz pactl move-sink-input ...komutasını Waschtl cevap (ile rekor-n-play yerine buhar ama) GUI pavucontrol(/ sorun giderme kontrol için ve büyük) daha basittir:

$ sudo apt-get install pavucontrol
$ pavucontrol &

Sonra kaydetmek istediğimiz uygulamada bazı sesler çalıyoruz. Gelen pavucontrol Playbacksekmesi, tüm uygulama açılır listesinde seçmek: "Kayıt-and-Play" .

Sonunda, aynı anda hem kayıt hem de dinleme yapmak için iyiyiz! ( topal mp3 örneği, ön planda koşmak)

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

Veya arka planda kaydedebilir ve istediğiniz zaman durdurabiliriz:

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

  • Her şeyi silmek veya işlemi yeniden denemek için: Bu cevabı kullanarak lavaboları silin veya sıfırlayın . pulseaudio -kher şeyi oturumun varsayılanlarına sıfırlamak için harika çalışıyor.
  • Sistem Ses Ayarlarındaki varsayılan çıkışı değiştirirsek, özel uygulama Oynatma ayarının üzerine yazılır ve kombine arayüze geri dönmek için pavucontrol'e geri dönmemiz gerekir.
  • Sesi birkaç "gerçek" arayüzden (örneğin, kulaklıklar, HDMI çıkışı, vb.) Dinleyebilmek için , rekor-n- sarkma kıvrımlı köleler olarak dinlemek için kullanabileceğimiz tüm "gerçek" çıkışları dahil etmeliyiz. gibi: pactl load-module module-combine-sink sink_name=record-n-play slaves=real-output-1,real-output-2.

EDIT: Dikkat edin, Ubuntu 18'den (belki de 17) beri, birleşik lavabo, gerçek çıktı cihazı yerine varsayılan sistem çıktı cihazı olma eğilimindedir. Bu nedenle, sistem tepsisindeki ses simgesini kullanarak ses seviyesini değiştirdiğinizde, kayıt sesinizi etkiler. Çözüm: Birleştirilmiş lavaboyu oluşturduktan sonra pavucontrolÇıktı sekmesinde açın. "Görünüm: Sanal Çıkış Aygıtları" nı seçin ve birleşik lavabonun ses seviyesini% 100 olarak sıfırlayın. Ardından "Görünüm: Donanım Çıkış Aygıtları" nı seçin ve gerçek çıkış aygıtında "Alternatif olarak tanımla" yeşil simgesine basın.


9

@ Waschtl'ın cevabı muhteşem. @ixtmixilix, kayıt bittikten sonra normal sesi geri yüklemeyi istedi. İşte bildiğim en kolay yol:

pavucontrolGUI'yi yükleyin ve çalıştırın . Ses çıkışı uygulamanızı görmelisiniz ve içindeki Playbacksekmenin altındaki ses ölçer . Yanında Null Output'ta çaldığını gösteren bir düğme olacak . Buna tıklayın ve benim durumumda sıradan ses çıkışınız olan Dahili Ses Analog Stereo'nuzu değiştirin .

İşte aradığınız ne bir ekran görüntüsü:

ekran görüntüsü

Bu yaklaşımı, ileride kaydınızı ayarlamak için de kullanabilirsiniz load-module; lavaboyu oluşturmak için @ Waschtl'ın cevabındaki komutu çalıştırın .


Yapabiliyorsanız, Imgur'a bir ekran görüntüsü yükleyin ve cevabınıza bağlayın .
Lucio

Yapılabilir olup olmadığını bilmiyorum, ama bence en iyi yol boş çıkış modülünü boşaltmaktır, böylece yeni çalma işlemleri varsayılan
Jack

6

KrisWebDev'in cevabını daha da iyileştirmek , eğer n- play'in her zaman erişilebilir olmasını istiyorsanız, önce varsayılan çıktıyı öğrenin:

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

hangi gibi bir şey çıkacak:

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

Sonra bir dosya oluşturun ~/.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"

Lütfen komuttan alsa_output.pci-0000_00_1b.0.analog-stereoaldığınız çıktı ile değiştirin pacmd. Özel bir yapılandırma dosyası bulunduğunda Pulse varsayılan yapılandırma dosyasını okumaz; bu nedenle yukarıdaki ilk satır varsayılan yapılandırma dosyasını içerir. Bu şekilde pulseaudio ilk önce varsayılan yapılandırmayı yükler.

pulseaudio -kMevcut pulseaudio örneğini öldürmek için koş , böylece yeni bir yapılandırma ile yeni bir tane başlat.

Herhangi bir zamanda buradaki değişiklikleri geri almak istiyorsanız, ~/.config/pulse/default.padosyayı kaldırın ve çalıştırın pulseaudio -k.

Record-n-play'in tüm çıktılar için varsayılan havuz olmasını istiyorsanız, sonuna sonuna başka bir satır ekleyerek bunu yapabilirsiniz ~/.config/pulse/default.pa:

set-default-sink record-n-play

Pulseaudio'nun halihazırda bilgi depoladığı programlar için, en son kullandıkları çıkış cihazını hatırlar, bu nedenle KrisWebDev'in cevabında açıklanan yöntemlerden birini kullanarak bunları manuel olarak yapılandırmanız gerekir.


2

Bu bash betiğini @Waschtl ve @KrisWebDev cevaplarının verdiği cevaplara dayanarak hazırladım.

Burada bulunabilir: https://gist.github.com/ramast/4be3314bc73f28f55e3604497188b007

Nasıl kullanılır?

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

Yeni sürüm

Eskisine göre bazı iyileştirmeler sunan bir python betiği oluşturdum. https://gist.github.com/ramast/c47bd5e57586e9c2deb74975e27089f0

Nasıl kullanılır?

$ ./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 tuşuna bastığınızda kayıt hemen başlayacaktır. Vurduğunuz zaman girdiğinizde uygulama zaten durduruldu (örneğin, mplayer'ı kapattıysanız), komut dosyası uygulama tekrar görünene ve kayda başlamaya kadar bekleyecektir.

Bu betiğe geri çekilme (orijinali vs) yalnızca liste aynı adda iki giriş içeriyorsa, betiğin doğru davranmamasıdır. Örneğin

$ ./pulse-recorder.py                                                                                                      

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

Birden fazla çıkışınız olması durumunda (örn. Hoparlörler, birkaç kulaklık, ses izleme), 21. satırda, örneğin: default_output = alsa_output.pci-0000_00_1b.0.analog-stereo ile pacmd listesinin çıkışından değiştirebilirsiniz. -sinks
smaudet
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.