Mengarahkan output audio dari program tertentu ke file

8

Saya ingin mengarahkan output audio suatu program ke file, pada baris perintah, seperti di

$ redirect-wrapper file.wav my-program

maka

  • Saya tidak mendengar output dari program, yaitu output seharusnya hanya pergi ke file
  • Saya tidak merekam apa pun selain program, yaitu hanya program khusus ini yang diarahkan ke file
  • sisa sistem audio dibiarkan sepenuhnya tidak terganggu, tidak ada opsi konfigurasi yang bolak-balik atau sesuatu seperti itu

Apakah ada cara untuk melakukan ini? Ini pertanyaan terkait tidak tidak membantu, saya membutuhkan solusi baris perintah, tidak ada "klik di sana, maka ada". Ini mungkin juga terkait, tetapi juga bergantung pada pavucontrol aplikasi grafis. Saya menemukan alternatif terminal untuk pavucontrol, pacmd.

Namun ini masih hanya memungkinkan kompromi berikut:

  1. Dapatkan bak cuci default dan simpan apa itu. Bagaimana? Mungkin menerobos masukpacmd list-sinks
  2. Atur wastafel default ke wastafel snd-aloop dengan pacmd set-default-sink.
  3. Rekam dari wastafel itu.
  4. Luncurkan aplikasi
  5. Tunggu hingga aplikasi membuka input wastafelnya: pacmd list-sink-inputs | grep name-of-my-programjika ini menemukan sesuatu, inputnya terbuka.
  6. Ubah kembali ke default dengan apa itu pacmd set-default-sink.
  7. Berhenti merekam begitu aplikasi ditutup.

Tapi ini masih mengubah bak cuci default untuk rentang waktu hingga beberapa menit (input bak cuci biasanya tidak dibuka sampai program benar-benar memutar suara yang tidak perlu tepat setelah diluncurkan). Saya menerapkan kompromi ini; Github .

Masih mencari jawaban yang tidak berkompromi.

Tak seorangpun
sumber
Ini bisa membantu: swview.org/node/213 Dia sementara berubah ~/.asoundrc. Mungkin Anda bisa menghindari ini entah bagaimana.
rudimeier
@rudimeier Yaitu secara global mengatur perangkat output default. Tidak peduli apakah dari ~ / .asoundrc atau dengan cara lain, itu akan selalu mengacaukan sisa sistem audio.
Tidak seorang pun
Tidak tahu, tapi saya pikir Anda berada di jalur yang benar. Keluaran pacmd listmenunjukkan sumber dan sink apa yang melekat pada program tertentu, jadi mungkin ada cara untuk mengubahnya. Coba tanyakan pada daftar pulseaudio di lists.freedesktop.org/mailman/listinfo/pulseaudio-discuss Pemelihara / pengembang ada di sana dan sangat membantu.
Joe
@ Jo Reassigning sinks dimungkinkan dengan pacmd, ya, tetapi karena mereka hanya dialokasikan ketika audio benar-benar mulai diputar (setidaknya untuk beberapa program; Firefox), itu berarti saya perlu mencari mereka dalam loop yang ketat dan mungkin akan melewatkan sekitar 0,5s atau lebih dari audio. Terima kasih atas tipnya tentang milis. :-)
Tidak ada yang

Jawaban:

2

Umm begitu melihat dokumentasi pulseaudio.

man pulseaudio

Kami memiliki variabel lingkungan berikut

   $PULSE_SERVER: the server string specifying the server to connect to when a client asks for a sound server connection  and  doesn't  explicitly  ask  for  a  specific
   server.  The server string is a list of server addresses separated by whitespace which are tried in turn. A server address consists of an optional address type speci‐
   fier (unix:, tcp:, tcp4:, tcp6:), followed by a path or host address. A host address may include an optional port number. A server address may be prefixed by a string
   enclosed in {}. In this case the following server address is ignored unless the prefix string equals the local hostname or the machine id (/etc/machine-id).

   $PULSE_SINK: the symbolic name of the sink to connect to when a client creates a playback stream and doesn't explicitly ask for a specific sink.

Mudah-mudahan ini memungkinkan Anda untuk mengganti pulseaudio sink, dan jika ini tidak cukup jalankan server pulseaudio sekali pakai kami sendiri.

Mengacu pada halaman ini ( /ubuntu/60837/record-a-programs-output-with-pulseaudio ), kami mencari tahu tentang perintah parec/ pacat(mereka alias) yang dapat merekam dari dan menulis ke sinks dan stream.

Menyatukan ini kita memiliki pembungkus berikut (yang saya belum benar-benar berjalan - meskipun saya berhasil mendapatkan metode ini untuk bekerja secara ad-hoc)

sink_name="sink-$(date +%s)"
pacat $sink_name.monitor 
parec -d steam.monitor | oggenc -b 192 -o /tmp/steam.ogg --raw - &
pid=$!
PULSE_SINK=$sink_name "$@"
kill $pid
Att Righ
sumber
Sekarang saya merasa bodoh. Terima kasih. ^^ Akhirnya saya akan belajar membaca dokumentasi terlebih dahulu.
Tidak ada yang