Lập trình chuyển hướng đầu ra âm thanh của chương trình cụ thể sang tập tin


8

Tôi muốn chuyển hướng đầu ra âm thanh của một chương trình sang tập tin, trên dòng lệnh, như trong

$ redirect-wrapper file.wav my-program

vậy nên

  • Tôi không nghe thấy đầu ra của chương trình, tức là đầu ra chỉ nên vào tập tin
  • Tôi không ghi lại bất cứ điều gì ngoài chương trình, tức là chỉ chương trình cụ thể này được chuyển hướng đến tệp
  • phần còn lại của hệ thống âm thanh không bị xáo trộn hoàn toàn, không có tùy chọn cấu hình nào được thay đổi qua lại hoặc đại loại như thế

Có cách nào để làm việc này không? Đây câu hỏi liên quan nào không giúp đỡ, tôi cần một giải pháp dòng lệnh, không có "click ở đó, sau đó". Điều này có lẽ cũng liên quan, nhưng cũng dựa vào pavucontrol ứng dụng đồ họa. Tôi tìm thấy một thiết bị đầu cuối thay thế cho pavucontrol, pacmd.

Nhưng điều này vẫn chỉ làm cho sự thỏa hiệp sau đây có thể xảy ra:

  1. Nhận chìm mặc định và lưu những gì nó đã được. Làm sao? Có lẽ đang đi quapacmd list-sinks
  2. Đặt bồn rửa mặc định thành chậu snd-aloop với pacmd set-default-sink.
  3. Ghi lại từ bồn rửa đó.
  4. Khởi chạy ứng dụng
  5. Đợi cho đến khi ứng dụng mở đầu vào chìm của nó: pacmd list-sink-inputs | grep name-of-my-programnếu điều này tìm thấy một cái gì đó, đầu vào được mở.
  6. Thay đổi mặc định trở lại với những gì nó đã được với pacmd set-default-sink.
  7. Dừng ghi âm khi ứng dụng đóng lại.

Nhưng điều này vẫn thay đổi mức chìm mặc định trong khoảng thời gian tối đa vài phút (đầu vào chìm thường không được mở cho đến khi chương trình thực sự phát âm thanh không cần phải ngay sau khi khởi chạy). Tôi đã thực hiện thỏa hiệp này; Github .

Vẫn đang tìm kiếm câu trả lời không thỏa hiệp.


Điều này có thể giúp: swview.org/node/213 Anh ấy đang tạm thời thay đổi ~/.asoundrc. Có lẽ bạn có thể tránh điều này bằng cách nào đó.
rudimeier

@rudimeier Đó là thiết lập đầu ra mặc định trên toàn cầu. Bất kể là từ ~ / .asoundrc hay theo một cách khác, nó sẽ luôn làm rối tung phần còn lại của hệ thống âm thanh.
Không ai vào

Không có ý tưởng, nhưng tôi nghĩ rằng bạn đang đi đúng hướng. Đầu ra của pacmd listchương trình cho thấy những nguồn và phần chìm nào được gắn vào các chương trình cụ thể, vì vậy có thể có một cách để thay đổi chúng. Hãy thử hỏi trên danh sách pulseaudio tạilists.freedesktop.org / mailman / listinfo / pulseaudio- discuss Các nhà bảo trì / nhà phát triển đang ở đó và khá hữu ích.
Joe

@Joe Tái chỉ định bồn rửa có thể với pacmd, vâng, nhưng vì chúng chỉ được phân bổ khi âm thanh thực sự bắt đầu phát (ít nhất là đối với một số chương trình; Firefox), điều đó có nghĩa là tôi sẽ cần tìm kiếm chúng trong một vòng lặp chặt chẽ và có thể sẽ bỏ lỡ 0,5 giây đầu tiên hoặc hơn của âm thanh. Cảm ơn các mẹo về danh sách gửi thư. :-)
Không ai vào

Câu trả lời:


2

Umm vì vậy nhìn vào tài liệu pulseaudio.

man pulseaudio

Chúng ta có các biến môi trường sau

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

Điều này hy vọng sẽ cho phép bạn hoàn thành việc thay thế bồn rửa pulseaudio và nếu điều này không đủ chạy máy chủ pulseaudio sử dụng một lần của chúng tôi.

Tham khảo trang này ( https://askubfox.com/questions/60837/record-a-programs-output-with-pulseaudio ), chúng tôi tìm hiểu về lệnh parec/ pacat(chúng là bí danh) có thể ghi từ và ghi vào phần chìm và dòng.

Kết hợp chúng lại với nhau, chúng ta có trình bao bọc sau (mà tôi chưa thực sự chạy - mặc dù tôi đã thành công có phương pháp này để hoạt động trên cơ sở đặc biệt)

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

Bây giờ tôi cảm thấy ngu ngốc. Cảm ơn. ^^ Cuối cùng tôi sẽ học cách đọc tài liệu trước.
Không ai vào
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.