Ghi lại đầu ra của chương trình với PulseAudio


49

Tôi muốn ghi lại một đầu ra của một chương trình với PulseAudio bằng cách sử dụng tập lệnh / bash script. Điều quan trọng là không ghi lại tất cả đầu ra, mà chỉ đầu ra từ một chương trình cụ thể.

Tôi nghĩ rằng tôi sẽ phải tạo ra một null-null mới và hơn là chuyển đầu ra của chương trình sang phần chìm mới này. Hơn nói với parec để sử dụng màn hình cụ thể này để ghi lại.

Bước đầu tiên sẽ là một cái gì đó như thế này:

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

Nhưng làm thế nào để di chuyển đầu ra của chương trình bây giờ đến bồn rửa này?
Và làm thế nào để ghi lại bồn rửa cụ thể với một tập lệnh bash?

Câu trả lời:


52

Hãy thử một cái gì đó như thế này:

Trong một thiết bị đầu cuối nhập

pacmd

(đây là CLI của PulseAudio-Server) sau đó sử dụng

list-sink-inputs

(nơi bạn nhận được các chỉ số của các đầu vào đang chạy) Bây giờ hãy tìm chỉ mục của đầu vào của bạn. Hiện được gọi là $ INDEX

phần kịch bản là:

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 -

Giải thích:

  • Lệnh đầu tiên sẽ thêm null-chìm như bạn đã biết.
  • Lệnh thứ hai di chuyển đầu vào chìm từ bồn rửa âm thanh tiêu chuẩn của bạn sang hơi nước
  • Lệnh thứ ba ghi lại màn hình của hơi nước thiết bị (-d) và đặt đầu ra (luồng sóng thô) vào oggenc, mã hóa luồng sóng này thành tệp oga. (đối với mp3 sử dụng khập khiễng)

Rực rỡ, cảm ơn bạn rất nhiều vì câu trả lời tuyệt vời này! :)
Lực lượng

2
Bạn có thể giải thích làm thế nào để hoàn tác thao tác này? bồn rửa null của tôi vẫn được ánh xạ tới các ứng dụng khác nhau và bây giờ tôi không có âm thanh!
ixtmixilix

@ixtmixilix: cách dễ nhất để khôi phục tất cả các cài đặt về mặc định là chỉ cần tắt và khởi động lại máy chủ pulseaudio. Nếu được đặt thành autospawn (đây là mặc định), bạn chỉ cần phát hành pulseaudio -ktrong một thiết bị đầu cuối.
Takkat

1
@ixtmixilix Khi bạn chạy list-sink-inputshãy lưu ý sinkgiá trị. Để trao đổi trở lại chỉ cần chạy pactl move-sink-input $INDEX $SINK. Một cái gì đó giống nhưpactl move-sink-input 4719 1
Ciaran

27

Cải thiện câu trả lời Waschtl của chủ đề này để bạn có thể LẮNG NGHE VÀ GHI âm thanh ứng dụng:

Đầu tiên, chúng tôi tìm đầu ra mặc định của mình và đặt tên chìm của nó vào $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

Sau đó, chúng tôi tạo ra một bồn rửa kết hợp chỉ có một nô lệ: $ DEFAULT_OUTPUT . Âm thanh do ứng dụng (nguồn) tạo ra sẽ được chuyển tiếp đến phần phụ nô lệ (tức là đầu ra thực) và chúng tôi cũng sẽ ghi lại nó. Nó khác với một bồn rửa rỗng , nơi âm thanh nguồn không được chuyển tiếp.

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

sink_properties là tùy chọn và có thể lỗi nếu bạn sử dụng khoảng trắng trong tên mô tả.

Sau đó, chúng ta có thể sử dụng pactl move-sink-input ...lệnh của câu trả lời Waschtl (với bản ghi-n-play thay vì steam ) nhưng GUI pavucontrolđơn giản hơn (và tuyệt vời để kiểm tra / xử lý sự cố):

$ sudo apt-get install pavucontrol
$ pavucontrol &

Sau đó, chúng tôi phát một số âm thanh trong ứng dụng mà chúng tôi muốn ghi lại. Trong pavucontrol Playbacktab, chúng tôi chọn trong danh sách thả xuống của ứng dụng: "Ghi và phát" .

Cuối cùng, chúng tôi rất tốt để ghi lại và lắng nghe cùng một lúc! ( ví dụ mp3 khập khiễng , chạy ở nền trước)

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

Hoặc chúng ta có thể ghi lại trong nền và dừng lại bất cứ lúc nào:

$ 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

Lưu ý:

  • Để hủy kết nối mọi thứ hoặc thử lại quy trình: Xóa hoặc đặt lại các bồn rửa bằng cách sử dụng câu trả lời này . pulseaudio -khoạt động tuyệt vời để thiết lập lại mọi thứ về mặc định của phiên.
  • Nếu chúng tôi thay đổi đầu ra mặc định trong Cài đặt âm thanh hệ thống, cài đặt Phát lại ứng dụng tùy chỉnh sẽ bị ghi đè và chúng tôi sẽ phải quay lại pavucontrol để đặt lại giao diện kết hợp.
  • Để có thể nghe âm thanh từ một số giao diện "thực" (ví dụ: tai nghe, đầu ra HDMI, v.v.), chúng ta nên bao gồm tất cả các đầu ra "thực" mà chúng ta có thể sử dụng để nghe, như các nô lệ slink -n-play , như : pactl load-module module-combine-sink sink_name=record-n-play slaves=real-output-1,real-output-2.

EDIT: Coi chừng, vì Ubuntu 18 (cũng có thể là 17), bồn rửa kết hợp có xu hướng trở thành thiết bị đầu ra hệ thống mặc định, thay vì thiết bị đầu ra thực. Vì vậy, khi bạn thay đổi âm lượng bằng biểu tượng âm thanh trong khay hệ thống, nó sẽ tác động đến âm thanh ghi của bạn. Giải pháp thay thế: Sau khi tạo bồn rửa kết hợp, mở pavucontroltrong tab Đầu ra. Chọn "Xem: Thiết bị đầu ra ảo" và đặt lại âm lượng của âm thanh kết hợp thành 100%. Sau đó chọn "Xem: Thiết bị đầu ra phần cứng" và nhấn biểu tượng màu xanh lá cây "Xác định thay thế" trên thiết bị đầu ra thực.


9

Câu trả lời của @ Waschtl thật tuyệt vời. @ixtmixilix hỏi về việc khôi phục âm thanh thông thường sau khi ghi xong. Đây là cách dễ nhất mà tôi biết:

Cài đặt và chạy pavucontrolGUI. Bạn sẽ thấy ứng dụng xuất âm thanh của mình và máy đo âm lượng dưới Playbacktab ở đó. Sẽ có một nút bên cạnh cho thấy nó đang phát trên Null Output . Nhấp vào đó và thay đổi nó thành đầu ra âm thanh thông thường của bạn, Âm thanh nổi tương tự tích hợp trong trường hợp của tôi.

Đây là một ảnh chụp màn hình của những gì bạn đang tìm kiếm:

ảnh chụp màn hình

Bạn cũng có thể sử dụng phương pháp này để thiết lập bản ghi của mình trong tương lai, sau khi bạn chạy load-modulelệnh trong câu trả lời của @ Waschtl để tạo bồn rửa.


Nếu bạn có thể, hãy tải lên ảnh chụp màn hình trong Imgur và liên kết nó với câu trả lời của bạn.
Lucio

Tôi không biết liệu nó có khả thi hay không, nhưng tôi nghĩ cách tốt nhất là dỡ bỏ mô-đun đầu ra null, để các phát lại mới không nhận nó theo mặc định
Jack

6

Cải thiện câu trả lời của KrisWebDev hơn nữa, nếu bạn muốn luôn luôn có sẵn bản ghi-n-play, trước tiên hãy tìm hiểu đầu ra mặc định:

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

sẽ xuất ra một cái gì đó như:

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

Tiếp theo, tạo một tệp ~/.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"

Vui lòng thay thế alsa_output.pci-0000_00_1b.0.analog-stereobằng bất cứ đầu ra nào bạn nhận được từ pacmdlệnh. Pulse không đọc tệp cấu hình mặc định khi tồn tại tệp cấu hình tùy chỉnh - đó là lý do tại sao dòng đầu tiên ở trên bao gồm tệp cấu hình mặc định. Bằng cách đó, pulseaudio vẫn tải cấu hình mặc định đầu tiên.

Chạy pulseaudio -kđể tiêu diệt cá thể pulseaudio hiện tại để một cái mới được bắt đầu với cấu hình mới.

Nếu bất cứ lúc nào bạn muốn hoàn tác các thay đổi ở đây, chỉ cần xóa ~/.config/pulse/default.patệp và chạy pulseaudio -k.

Nếu bạn muốn bản ghi-n-play là mức chìm mặc định cho tất cả các đầu ra, bạn có thể làm điều đó bằng cách thêm một dòng khác vào cuối ~/.config/pulse/default.pa:

set-default-sink record-n-play

Đối với các chương trình mà pulseaudio đã lưu trữ thông tin trên đó, nó sẽ nhớ bất kỳ thiết bị đầu ra nào họ sử dụng trước đây, vì vậy bạn sẽ phải tự cấu hình lại những thiết bị đó bằng một trong những phương pháp được mô tả trong câu trả lời của KrisWebDev.


2

Tôi đã tạo tập lệnh bash này dựa trên các câu trả lời được cung cấp bởi các câu trả lời @Waschtl và @KrisWebDev.

Có sẵn tại đây: https://gist.github.com/ramast/4be3314bc73f28f55e3604497188b007

Sử dụng như thế nào?

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

Phiên bản mới

Tôi đã tạo một tập lệnh python cung cấp một số cải tiến so với tập lệnh cũ. https://gist.github.com/ramast/c47bd5e57586e9c2deb74975e27089f0

Sử dụng như thế nào?

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

Khi bạn nhấn enter, ghi âm sẽ bắt đầu ngay lập tức. nếu tại thời điểm bạn nhấn, ứng dụng đã bị dừng (ví dụ: bạn đã đóng mplayer), tập lệnh sẽ đợi cho đến khi ứng dụng xuất hiện lại và bắt đầu ghi.

Điều duy nhất rút lại cho tập lệnh đó (so với tập lệnh gốc) là nếu danh sách chứa hai mục có cùng tên, tập lệnh sẽ không hoạt động chính xác. Ví dụ

$ ./pulse-recorder.py                                                                                                      

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

Trong trường hợp bạn có nhiều đầu ra (ví dụ: loa, nhiều tai nghe, âm thanh màn hình), bạn có thể thay thế trên dòng 21 bằng ví dụ: defaultDefput = alsaDefput.pci-0000_00_1b.0.analog-stereo trong đó đây là từ đầu ra của danh sách pacmd -sinks
smaudet
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.