กำหนดเส้นทางสตรีม ICECAST ไปยังอุปกรณ์จำลอง


0

ฉันต้องการส่งสตรีม icecast ไปยัง udp ผ่าน FFmpeg แต่หากสตรีม icecast จะลดลง FFmpeg ก็จะลดลงด้วย ฉันคิดว่าถ้าฉันสามารถเส้นทางสตรีม icecast ไปยังอุปกรณ์หุ่น Alsa แล้วฉันจะได้รับข้อมูลจากมันผ่านทาง FFmpeg ตัวอย่างเช่น:

ffmpeg -f alsa -i hw:Dummy,0 -f mpegts udp://ip:port

จากนั้นในกรณีที่สตรีม icecast หล่นลงสตรีม udp เอาต์พุตจะเล่นอย่างเงียบ ๆ และเล่นเสียงต่อไปจนกว่าสตรีมนี้จะใช้งานได้อีกครั้ง (นี่คือสมมติฐานของฉัน)

มีวิธีการส่งกระแสข้อมูล icecast ไปยังอุปกรณ์จำลองของ alsa หรือไม่? หรือมีตัวแปรอื่นสำหรับการกำหนดเส้นทางสตรีม icecast ไปยัง udp เพื่อเล่นแบบเงียบ ๆ ในกรณีที่ drop down สตรีม icecast จากนั้นกลับสู่การเล่นปกติโดยอัตโนมัติเมื่อสตรีม icecast กลับมาใช้ได้อีกครั้งหรือไม่


คุณติดแท็กคำถามนี้ด้วย pulseaudio ต้องเป็นอุปกรณ์จำลอง ALSA หรือเป็นแหล่ง Pulseaudio ด้วยหรือไม่ การตั้งค่าง่ายขึ้นมาก (แม้ว่าฉันไม่แน่ใจเกี่ยวกับพฤติกรรมเริ่ม / หยุดจะต้องทราบว่า)
dirkt

@dirkt ขอบคุณสำหรับความคิดเห็น! มันเป็นอุปกรณ์จำลอง ALSA ฉันแท็กคำถามด้วย pulseaudio เพราะฉันเข้าใจว่าเราสามารถใช้ pulseaudio เพื่อกำหนดเส้นทางสตรีม icecast ไปยังอุปกรณ์ ALSA แต่ฉันอาจผิด) ในกรณีใด ๆ ที่ฉันต้องการสร้างอุปกรณ์เสียงเสมือน - & gt; กำหนดเส้นทางสตรีม icecast ไปยัง & - gt; รับสตรีมนี้จากอุปกรณ์เสียงเสมือนผ่าน ffmpeg การแก้ปัญหาใด ๆ จะเหมาะสมโดยไม่มีเงื่อนไขบังคับ)
Ivan Kolesnikov

คำตอบ:


1

ฉันตีความความคิดเห็นของคุณว่า "การใช้ Pulseaudio เพื่อทำเช่นนั้นก็โอเค" ฉันยังไม่ได้ทดสอบสิ่งนี้ แต่นี่คือสิ่งที่ฉันจะทำ:

ก่อนอื่นให้สร้างอ่างล้างจาน "null" Pulseaudio:

pacmd load-module module-null-sink sink_name=icecast sink_properties=device.description=Icecast

ใน Pulseaudio อ่างล้างจานแต่ละอันมีส่วนเกี่ยวข้อง .monitor แหล่งที่มาดังนั้นด้วยวิธีนี้คุณสามารถส่งสัญญาณเสียงไปยัง icecast ซิงค์และประมวลผลในแอปพลิเคชั่นอื่นโดยใช้ icecast.monitor แหล่ง

ถ้าฉันเข้าใจคุณอย่างถูกต้องคุณต้องการ รับ สตรีม icecast บนคอมพิวเตอร์ของคุณ เพื่อส่งกระแสข้อมูลไปยัง icecast อ่างทำสิ่งที่ชอบ

mplayer http://your.icecast.server -ao pulse::icecast

เมื่อสตรีม icecast สิ้นสุดลง mplayer จะหยุดเช่นกันดังนั้นให้ห่อคำว่า shell script ไว้ภายใน infinite while ห่วง ฯลฯ

ฉันไม่แน่ใจว่าฉันเข้าใจสิ่งที่คุณพยายามทำกับส่วน "สตรีมถึง udp ผ่าน ffmpeg" ไม่ว่าในกรณีใดคุณสามารถอ่านได้จากตอนนี้ icecast.monitor กับ

ffmpeg -f alsa -i pulse ...

ในขณะที่ใช้ pavucontrol หรือ pamcd เพื่อเลือกแหล่งสัญญาณที่ถูกต้องหรือหากคุณ ffmpeg สามารถคอมไพล์ด้วยการสนับสนุน pulseaudio โดยตรง

ffmpeg -f pulse -i icecast.monitor ...

อย่างไรก็ตามหากแนวคิดคือ "ฉันต้องการกระจายสตรีม icecast นั้นไปยังคอมพิวเตอร์เครื่องอื่นในเครือข่ายในบ้านของฉัน" อาจเป็นการดีกว่าถ้าใช้ โมดูล Pulseaudio RTP เหมือนอ่างล้างจานในตอนแรก

ดังที่ฉันได้กล่าวมาแล้วสิ่งเหล่านี้ไม่ผ่านการทดสอบคุณอาจต้องปรับแต่งชิ้นส่วนเพื่อให้ทำงานได้

แก้ไข

ฉันยังไม่แน่ใจว่าอุปกรณ์จำลอง ALSA จะทำงานได้ตั้งแต่แรกเพราะความเข้าใจของฉันว่าเป็นเพียงอุปกรณ์ "จำลอง" และไม่ให้ลูปแบ็ค คุณต้องใช้ snd-aloop อุปกรณ์ลูปแบ็คสำหรับเรื่องนั้นและอันนี้เป็นบิตของความเจ็บปวดเพราะคุณพบปัญหาอัตราการสุ่มตัวอย่างเป็นต้น

ดังนั้นคุณจะดีกว่าการใช้โครงสร้างพื้นฐาน Pulseaudio


ขอบคุณมาก! ฉันตรวจสอบและใช้งานได้ดี! เงียบเมื่อสตรีม icecast หยุดทำงานและเล่นโดยไม่มีข้อผิดพลาดใด ๆ เมื่อทำงานอีกครั้ง! เอาต์พุต UDP มีเสถียรภาพ!
Ivan Kolesnikov

1

คุณสามารถใช้อุปกรณ์วนรอบแทนอุปกรณ์จำลอง

อุปกรณ์ Loopback ไม่ได้เปิดใช้งานตามค่าเริ่มต้นดังนั้นคุณต้องโหลดโมดูลเคอร์เนล snd-aloop ก่อนด้วยอาร์กิวเมนต์เพื่อระบุประเภทและจำนวนที่ต้องการ:

# modprobe snd-aloop index=0 pcm_substreams=1

จากนั้นแทนที่จะกำหนดเส้นทาง icecast ไปที่ hw:Dummy,0คุณสามารถกำหนดเส้นทางไปยัง hw:Loopback,0,0 และอ่านสตรีมนั้นใน ffmpeg จาก hw:Loopback,1,0.


ขอบคุณสำหรับคำตอบ! คุณช่วยอธิบายวิธีกำหนดเส้นทางสตรีม icecast ไปยังอุปกรณ์ alsa loopback ได้หรือไม่?
Ivan Kolesnikov

1
@IvanKolesnikov นั่นควรจะทำได้กับผู้เล่นทุกคนที่สามารถสตรีมจาก IceCast ได้ตราบใดที่คุณเล่นไปยังอุปกรณ์ hw: Loopback, 0,0 ตัวอย่างเช่นด้วย MPV คุณต้องทำ mpv --audio-device=alsa/hw:Loopback,0,0 http://example.com/path/to/icecast/stream หรือด้วย SoX คุณจะทำ sox http://example.com/path/to/icecast/stream -t alsa hw:Loopback,1,0.
Aaron Muir Hamilton
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.