สตรีมเสียงสดโดยใช้ FFMPEG


14

ฉันพยายามสตรีมเสียงสดโดยใช้ffmpegไมโครโฟน USB ภายนอก ฉันทำตามกวดวิชานี้เกือบ

ฉันต้องปรับเปลี่ยนบางขั้นตอน แต่ในที่สุดฉันก็รับกระแสแล็ปท็อปของฉันโดยใช้คำสั่งนี้:

ffmpeg -f oss -i /dev/dsp1 -acodec libmp3lame -ab 32k -ac 1 -re -f rtp rtp://192.168.28.116:1234

CPU อยู่ใกล้ 100% ฉันมีเสียงไม่ดีในช่วงสองวินาทีและหลังจากไม่มีอะไร ... ฉันเห็นใน Wireshark ว่าบอร์ดกำลังส่งเฟรมอย่างต่อเนื่อง

บางคนมีแนวคิดที่จะลดการใช้ CPU หรือไม่


คุณอาจต้องการดูการโอเวอร์คล็อกและการแยกหน่วยความจำที่แตกต่างกัน หากคุณมีตัวเลือกของตัวแปลงสัญญาณคุณอาจสามารถปรับปรุงบางอย่างโดยการสลับ คุณอาจต้องการตรวจสอบการบีบอัดของสตรีม - ซึ่งอาจเป็นศูนย์ได้บ้าง - สิ่งใดก็ตามที่คุณได้รับจากเวลาถ่ายโอนอาจสูญหายไปในการบีบอัด
Steve Robillard

คุณลองเขียนไปที่ไฟล์ในเครื่องก่อนหรือไม่? ฉันจะพยายามทีละขั้นตอน: 1) การบันทึกเรียลไทม์ไปยังไฟล์คลื่น 2) การบันทึกเรียลไทม์ไปยังไฟล์ MP3 3) การสตรีมเนื้อหาผ่านเครือข่าย
pixelistik

ไม่ใช่ตอนนี้. ดูเหมือนจะซับซ้อนในการทำทุกขั้นตอนด้วยตนเองแทนที่จะเป็นอัตโนมัติเต็มรูปแบบ ffmpeg ;-)
ฮอต

คุณกำลังบันทึกอะไร
อเล็กซ์แชมเบอร์เลน

1
ฉันกำลังพยายามทำอีเทอร์เน็ต babyphone
ฮอตสปอต

คำตอบ:


7

หากต้องการตอบคำถามเฉพาะของคุณคุณสามารถลด CPU โดยการไพพ์ arecord ลงใน ffmpeg:

arecord -f cd -D plughw:1,0 | ffmpeg -i - -acodec libmp3lame -ab 32k -ac 1 -re -f rtp rtp://234.5.5.5:1234

คุณจะต้องแทนที่ plughw: 1,0 ด้วยการ์ดเสียงเฉพาะของคุณ ดู arecord -l สำหรับข้อมูล ใน Rasp Pi ของฉันมันเพิ่มจาก ~ 95% CPU เป็น ~ 35%


6

ALSA อินพุต

ทางเลือกหนึ่งคือไปผ่าน ALSA คำสั่งที่คล้ายกันข้างต้นจะเป็น

ffmpeg -ac 1 -f alsa -i hw:0,0 -acodec libmp3lame -ab 32k -ac 1 -re -f rtp rtp://localhost:1234

ฉันไม่แน่ใจว่าสิ่งนี้จะส่งผลกระทบต่อการใช้งาน CPU อย่างไร


ฉันพยายาม: ffmpeg -ac 1 -f alsa -i hw: 1,0 -acodec libmp3lame -ab 32k -ac 1 -re -f rtp rtp: //192.168.1.116: 1234 แต่ ffmpeg ล่มหลังจาก somes วินาที 0x7a1510] ALSA buffer xrun ความคิดอื่น ๆ ?
hotips

ฉันทดสอบ ffmpeg -f oss -i / dev / dsp1 -ab 32k -ac 1 -re -f rtp rtp: //192.168.28.116: 1234 แต่เสียงไม่ดีมาก ... ในความล่าช้าประมาณ 6 วินาที ความคิดใดที่จะมีทางออกที่ดีกว่า?
hotips

1
@ si2w ฉันคิดว่า 32k สำหรับ mp3 เป็นเรื่องตลก หรือลองใช้ตัวแปลงสัญญาณอื่น อาจเป็นหนึ่งในซีรี่ส์ G2xx ที่ออกแบบมาสำหรับโทรศัพท์
Alex Chamberlain

3

สิ่งนี้ทำงานและลดการใช้ cpu:

ffmpeg -f alsa -i default:CARD=U0x46d0x819 -acodec mp2 -ac 1 -re -f rtp rtp://234.5.5.5:1234 2> /tmp/mylog.log &

ตรวจสอบให้แน่ใจว่าได้แทนที่ค่าเริ่มต้น: CARD = U0x46d0x819 ด้วย ID ไมโครโฟนของคุณ (ที่ได้รับจาก arecord -l) หรือคุณระบุ-i hw:0,0(หรืออุปกรณ์ใดก็ตาม)

ฉันมีปัญหาคล้ายกัน - การเข้ารหัส mp3 ใช้พลังงานซีพียู 90% + และไม่สามารถติดตามเสียงได้ - ดังนั้นฉันจึงเปลี่ยนเป็นการเข้ารหัสแบบ MP2 สิ่งนี้ใช้ CPU ประมาณ 15-18% (วัด vi top) และสตรีมไปยัง VLC บน LAN ของฉันได้อย่างราบรื่น มันจะทำให้การดูแลทารกที่สมบูรณ์แบบหรืออะไรก็ตาม มีความล่าช้าเพียงเสี้ยววินาทีซึ่งเป็นบัฟเฟอร์ที่ปลาย VLC

หมายเหตุ:ที่อยู่ ip เป็นที่อยู่แบบหลายผู้รับ ([224-239] .xyz) คุณไม่จำเป็นต้องตั้งเป้าหมายไว้ที่อุปกรณ์เครือข่ายเฉพาะบน LAN ของคุณและเราเตอร์บรอดแบนด์ของคุณจะรักษาปริมาณการใช้งานในเครื่อง (ตามค่าเริ่มต้น)


2

คุณสามารถลดโหลด CPU อย่างมีนัยสำคัญโดยการลดอัตราตัวอย่างเสียงของอุปกรณ์อินพุต ( -ar 8000 ก่อน -f alsa ) และการตั้งค่าอัตราบิตเสียงของตัวแปลงสัญญาณเป็น 128k ( -b:a 128k) นอกจากนี้การลดจำนวนช่องสัญญาณ ( -ac 1) ก็ดูเหมือนจะเพิ่มภาระของ CPU ดังนั้นฉันจึงพบว่าคำสั่งนี้ทำงานที่ CPU ที่ค่อนข้างต่ำ:

ffmpeg -ar 8000 -f alsa -i hw:0 -acodec mp2 -b:a 128k -f rtp rtp://other:4444

แม้ว่าจะต้องจำไว้ว่ามันยังขึ้นอยู่กับความสามารถของฮาร์ดแวร์การจับที่พยายามใช้และรุ่นของ ffmpeg / avconv

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.