บันทึกผลลัพธ์ของโปรแกรมด้วย PulseAudio


49

ฉันต้องการบันทึกผลลัพธ์ของโปรแกรมด้วยPulseAudioโดยใช้ command line / bash script มันเป็นสิ่งสำคัญที่จะไม่บันทึกเอาท์พุททั้งหมด แต่เพียงเอาท์พุทจากหนึ่งโปรแกรมเฉพาะ

ฉันคิดว่าฉันจะต้องสร้าง null-sink ใหม่และย้ายเอาท์พุทของโปรแกรมไปที่ sink ใหม่นี้ กว่าบอกparec ที่จะใช้จอภาพนี้เพื่อบันทึก

ขั้นตอนแรกจะเป็นดังนี้:

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

แต่จะย้ายเอาท์พุทของโปรแกรมไปที่ sink นี้ได้อย่างไร
และวิธีการบันทึกอ่างล้างจานที่เฉพาะเจาะจงด้วยสคริปต์ทุบตี?

คำตอบ:


52

ลองสิ่งนี้:

ในสถานีป้อน

pacmd

(นี่คือ CLI ของ PulseAudio-Server) จากนั้นใช้

list-sink-inputs

(ที่คุณได้รับดัชนีของอินพุตที่ทำงาน) ตอนนี้หาดัชนีของอินพุตของคุณ ตอนนี้เรียกว่า $ INDEX

ส่วนที่เขียนได้คือ:

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 -

คำอธิบาย:

  • คำสั่งแรกจะเพิ่ม null-sink ตามที่คุณรู้แล้ว
  • คำสั่งที่สองย้าย sink-input จาก audio-sink มาตรฐานของคุณเป็น steam
  • คำสั่งที่สามบันทึกการตรวจสอบของอุปกรณ์ไอน้ำ (-d) และทำให้เอาท์พุท (raw-wave-stream) ลงใน oggenc ซึ่งเข้ารหัสคลื่นกระแสนี้ไปยังไฟล์ oga-file (สำหรับ mp3 ใช้ง่อย)

ยอดเยี่ยมขอบคุณมากสำหรับคำตอบที่ยอดเยี่ยมนี้! :)
บังคับ

2
คุณช่วยอธิบายวิธีการยกเลิกการดำเนินการนี้ได้ไหม อ่างล้างมือว่างของฉันยังคงแมปกับแอปพลิเคชั่นต่าง ๆ และตอนนี้ฉันไม่มีเสียง!
ixtmixilix

@ixtmixilix: วิธีที่ง่ายที่สุดในการกู้คืนการตั้งค่าทั้งหมดเป็นค่าเริ่มต้นคือเพียงแค่ฆ่าและรีสตาร์ทเซิร์ฟเวอร์ pulseaudio หากตั้งค่าเป็น autospawn (นี่คือค่าเริ่มต้น) คุณเพียงแค่ออกpulseaudio -kในเทอร์มินัล
Takkat

1
@ixtmixilix เมื่อคุณเรียกlist-sink-inputsใช้จดsinkค่า pactl move-sink-input $INDEX $SINKเพื่อสลับกลับมาเพียงแค่เรียกใช้ มีบางอย่างที่เหมือนกันpactl move-sink-input 4719 1
Ciaran

27

การปรับปรุงคำตอบ Waschtlของชุดข้อความนี้เพื่อให้คุณสามารถฟังและบันทึกเสียงของแอปได้:

อันดับแรกเรามองหาเอาต์พุตเริ่มต้นของเราและใส่ชื่อ sink ใน$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

จากนั้นเราจะสร้างอ่างล้างจานรวมที่มีเพียงหนึ่งทาส: $ DEFAULT_OUTPUT เสียงที่สร้างขึ้นโดยแอพ (แหล่งที่มา) จะถูกส่งต่อไปยังสลาฟทาส (เช่นเอาต์พุตจริง) และเราจะบันทึกเสียงด้วย มันแตกต่างจากอ่างล้างจาน nullที่ไม่มีการส่งต่อเสียงต้นทาง

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

sink_properties เป็นทางเลือกและอาจมีข้อบกพร่องหากคุณใช้ช่องว่างในชื่อคำอธิบาย

จากนั้นเราสามารถใช้pactl move-sink-input ...คำสั่งของคำตอบ Waschtl (ด้วยการบันทึก -n-playแทนที่จะเป็นไอน้ำ ) แต่ GUI pavucontrolนั้นง่ายกว่า (และยอดเยี่ยมสำหรับการตรวจสอบ / แก้ไขปัญหา):

$ sudo apt-get install pavucontrol
$ pavucontrol &

จากนั้นเราเล่นเสียงในแอพที่เราต้องการบันทึก ในpavucontrol Playbackแท็บที่เราเลือกในรายการ app แบบเลื่อนลง: "บันทึก-and-Play"

ในที่สุดเราก็ยินดีที่จะบันทึกและฟังในเวลาเดียวกัน! ( ตัวอย่าง mp3 lameทำงานในเบื้องหน้า)

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

หรือเราสามารถบันทึกเป็นพื้นหลังและหยุดเมื่อใดก็ได้:

$ 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

หมายเหตุ:

  • หากต้องการเลิกทำทุกอย่างหรือลองใหม่อีกครั้งขั้นตอน: ลบหรือรีเซ็ตอ่างล้างมือโดยใช้คำตอบนี้ pulseaudio -kใช้งานได้ดีในการรีเซ็ตทุกอย่างเป็นค่าเริ่มต้นของเซสชัน
  • หากเราเปลี่ยนเอาต์พุตเริ่มต้นในการตั้งค่าระบบเสียงการตั้งค่าการเล่นแอพที่กำหนดเองจะถูกเขียนทับและเราจะต้องกลับไปที่ pavucontrol เพื่อตั้งค่ากลับเป็นอินเทอร์เฟซที่รวมกัน
  • เพื่อให้สามารถฟังเสียงจากอินเทอร์เฟซ "ของจริง" (เช่นหูฟังเอาต์พุต HDMI ฯลฯ ... ) เราควรรวมเอาท์พุท "ของจริง" ทั้งหมดที่เราอาจใช้ฟังเป็นทาส slink บันทึก -n-playpactl load-module module-combine-sink sink_name=record-n-play slaves=real-output-1,real-output-2เช่น:

แก้ไข: ระวังตั้งแต่ Ubuntu 18 (อาจ 17 เกินไป) อ่างรวมที่รวมกันมีแนวโน้มที่จะกลายเป็นอุปกรณ์ส่งออกระบบเริ่มต้นแทนที่จะเป็นอุปกรณ์ส่งออกจริง ดังนั้นเมื่อคุณเปลี่ยนระดับเสียงโดยใช้ไอคอนเสียงในซิสเต็มเทรย์ระบบจะส่งผลต่อเสียงบันทึกของคุณ วิธีแก้ปัญหา: หลังจากสร้างอ่างรวมแล้วให้เปิดpavucontrolในแท็บเอาท์พุท เลือก "มุมมอง: อุปกรณ์ส่งออกเสมือน" และรีเซ็ตระดับเสียงของอ่างรวมรวมเป็น 100% จากนั้นเลือก "มุมมอง: อุปกรณ์ส่งออกฮาร์ดแวร์" และกดไอคอนสีเขียว "กำหนดเป็นทางเลือก" บนอุปกรณ์แสดงผลจริง


9

คำตอบของ @ Waschtl นั้นยอดเยี่ยม @ixtmixilix ถามเกี่ยวกับการกู้คืนเสียงปกติหลังจากการบันทึกเสร็จสิ้น นี่เป็นวิธีที่ง่ายที่สุดที่ฉันรู้:

ติดตั้งและเรียกใช้pavucontrolGUI คุณควรเห็นแอปพลิเคชั่นเอาท์พุทเสียงและมันเป็นเครื่องวัดระดับเสียงใต้Playbackแท็บในนั้น จะมีปุ่มถัดไปแสดงให้เห็นว่ามันเล่นเอาท์พุท Null คลิกที่นั้นและเปลี่ยนเป็นสัญญาณเสียงธรรมดาของคุณ, สเตอริโออนาล็อกในตัวในกรณีของฉัน

นี่คือภาพหน้าจอของสิ่งที่คุณกำลังมองหา:

ภาพหน้าจอ

คุณยังสามารถใช้วิธีนี้เพื่อตั้งค่าการบันทึกของคุณในอนาคตหลังจากที่คุณได้รันload-moduleคำสั่งในคำตอบของ @ Waschtl เพื่อสร้าง sink


หากทำได้ให้อัปโหลดภาพหน้าจอในImgurและเชื่อมโยงไปยังคำตอบของคุณ
Lucio

ฉันไม่ทราบว่าเป็นไปได้หรือไม่ แต่ฉันคิดว่าวิธีที่ดีที่สุดคือการยกเลิกการโหลดโมดูลเอาท์พุท null เพื่อให้การเล่นใหม่ไม่ได้รับตามค่าเริ่มต้น
แจ็ค

6

การปรับปรุงคำตอบของKrisWebDevต่อไปถ้าคุณต้องการให้ record-n-play พร้อมใช้งานอยู่เสมอก่อนอื่นให้ค้นหาผลลัพธ์เริ่มต้น:

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

ซึ่งจะแสดงผลออกเช่น:

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

ถัดไปสร้างไฟล์~/.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"

โปรดแทนที่alsa_output.pci-0000_00_1b.0.analog-stereoด้วยสิ่งที่คุณได้รับจากpacmdคำสั่ง Pulse ไม่อ่านไฟล์กำหนดค่าเริ่มต้นเมื่อมีไฟล์กำหนดค่าเองอยู่นั่นคือเหตุผลที่บรรทัดแรกด้านบนมีไฟล์กำหนดค่าเริ่มต้น ด้วยวิธีนี้ pulseaudio ยังคงโหลดการกำหนดค่าเริ่มต้นก่อน

เรียกใช้pulseaudio -kเพื่อฆ่าอินสแตนซ์ pulseaudio ปัจจุบันเพื่อเริ่มต้นใหม่ด้วยการกำหนดค่าใหม่

เมื่อใดก็ตามที่คุณต้องการที่จะยกเลิกการเปลี่ยนแปลงที่นี่เพียงลบไฟล์และเรียกใช้~/.config/pulse/default.papulseaudio -k

หากคุณต้องการให้ record-n-play เป็น sink เริ่มต้นสำหรับเอาต์พุตทั้งหมดคุณสามารถทำได้โดยเพิ่มอีกบรรทัดหนึ่งไปที่ส่วนท้ายของ~/.config/pulse/default.pa:

set-default-sink record-n-play

สำหรับโปรแกรมที่ pulseaudio ได้เก็บข้อมูลไว้แล้วมันจะจดจำอุปกรณ์เอาท์พุทที่ใช้ล่าสุดดังนั้นคุณจะต้องกำหนดค่าใหม่ด้วยตนเองโดยใช้วิธีใดวิธีหนึ่งที่อธิบายไว้ในคำตอบของ KrisWebDev


2

ฉันได้สร้างสคริปต์ทุบตีนี้ขึ้นอยู่กับคำตอบของ @Waschtl และ @KrisWebDev คำตอบ

วางจำหน่ายแล้วที่นี่: https://gist.github.com/ramast/4be3314bc73f28f55e3604497188b007

วิธีใช้?

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

เวอร์ชั่นใหม่

ฉันสร้างสคริปต์หลามที่เสนอการปรับปรุงบางอย่างกับสคริปต์เก่า https://gist.github.com/ramast/c47bd5e57586e9c2deb74975e27089f0

วิธีใช้?

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

เมื่อคุณกดเข้าสู่การบันทึกจะเริ่มทันที หากเวลาที่คุณกดเข้าสู่แอปพลิเคชันหยุดแล้ว (เช่นคุณปิด mplayer เป็นต้น) สคริปต์จะรอจนกระทั่งแอปปรากฏขึ้นอีกครั้งและเริ่มการบันทึก

การดึงกลับไปที่สคริปต์นั้น (เทียบกับต้นฉบับ) คือถ้ารายการมีสองรายการที่มีชื่อเดียวกันสคริปต์จะทำงานไม่ถูกต้อง ตัวอย่างเช่น

$ ./pulse-recorder.py                                                                                                      

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

ในกรณีที่คุณมีเอาต์พุตหลายตัว (เช่นลำโพง, ชุดหูฟังหลายตัว, ตรวจสอบเสียง) คุณสามารถแทนที่บรรทัดที่ 21 ด้วยเช่น: default_output = alsa_output.pci-0000_00_1b.0.analog-stereo โดยที่นี่มาจากรายการ pacmd -sinks
smaudet
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.