สตรีมมิ่ง H264 กับ Logitech C920


13

ฉันมีเว็บแคม Logitech C920 มันมีความสามารถในการเข้ารหัสวิดีโอโดยตรงใน H264

ผมต้องการที่จะทำซ้ำสิ่งที่ได้กระทำกับ BeagleBone แต่ใช้ Raspberry Pi: ส่งกระแส H264 ให้เครือข่าย Raspberry Pi นั้นอยู่ที่นี่เท่านั้นเพื่อส่งกระแสข้อมูลใน RTP, การบีบอัดวิดีโอจะทำโดยเว็บแคมเอง โหมด H264 ถูกบังคับใช้โดย video4linux

จนถึงตอนนี้และถ้าฉันใช้คอมพิวเตอร์ทั่วไปกับ Ubuntu เวอร์ชันล่าสุดมันใช้ VLC เป็นเซิร์ฟเวอร์หรือ GStreamer ตัวอย่างเช่นถ้าฉันเปิดใช้งานเซิร์ฟเวอร์ Raspberry Pi a VLC โดยใช้คำสั่ง:

cvlc --sout=#rtp{sdp=rtsp://:8554/test} 'v4l2:///dev/video0:chroma=H264:width=800:height=600:fps=30'

... และถ้าฉันอ่านสตรีมด้วย VLC บนคอมพิวเตอร์เครื่องอื่นมันก็ใช้ได้

อย่างไรก็ตามถ้าฉันใช้ราสเบอร์รี่ Pi เพื่อส่งวิดีโอสตรีมผลลัพธ์ค่อนข้างแย่ ขยะจำนวนมากในภาพทันทีที่บางสิ่งเคลื่อนที่ ปุ่มภาพได้รับการตอบรับดีทุก ๆ 10 วินาที แต่ในขณะเดียวกันก็ไม่ดีพอเมื่อเทียบกับสตรีมจากคอมพิวเตอร์ทั่วไป

ฉันยังลองวิธีที่อธิบายสำหรับสายสืบด้วยยูทิลิตี้"การจับภาพ" ที่ให้มา : ตกลงถ้าฉันสตรีมจากคอมพิวเตอร์จริงปัญหาขยะเดียวกันถ้าฉันสตรีมจากราสเบอร์รี่ Pi

ไม่ใช่ปัญหาเครือข่าย: ฉันทำการตรวจสอบเครือข่ายบางอย่างกับ Wireshark และสถิติของ VLC ฉันไม่มีการสูญหายของแพ็กเก็ต ฉันลองกับ Raspbian และ Arch Linux สำหรับ Raspi (gstreamer 0.10 ใน raspbian, gstreamer 1.0 ใน Arch Linux)

ฉันไม่ทราบว่ามีความเกี่ยวข้องหรือไม่ แต่ฉันยังได้ทดสอบด้วยรุ่น soft float support ของ Raspbian ต้องทำการอัพเดตก่อนเพื่อใช้เคอร์เนล 3.2 แต่ปัญหาเดียวกันวิดีโอมีขยะ

มีความคิดเกี่ยวกับสิ่งที่ฉันสามารถทำได้เพื่อปรับปรุงคุณภาพวิดีโอหรือไม่


ลองลดอัตราเฟรม ซีพียูของ rPi นั้นแย่มากดังนั้นฉันเดาว่าการส่งภาพ 800x600 ที่ 30FPS นั้นมากเกินไป เฉพาะบอร์ดกล้อง rPI ใหม่ที่เชื่อมต่อผ่านขั้วต่อ MIPI / CIS (แทน USB) สตรีม 1080p ที่ 15-30 FPS
Matthias

ไม่ใช่ FPS Pi สามารถจัดการ HD ที่ 60FPS ได้โดยไม่มีปัญหาในการใช้โมดูลกล้อง Pi หากกล้อง Logitech ส่งวิดีโอ H264 ไปแล้วมันเข้ารหัสแล้วและ Pi ต้อง boradcast แพ็กเก็ตอีกครั้ง .. ซึ่งมันมีความสามารถทั้งหมด ในความเป็นจริงมันสามารถทำการสตรีมใหม่สตรีมได้สูง 6 HD @ 25FPS ก่อนที่จะหมด มันจะต้องเป็นไดร์เวอร์ V4L ที่ทำลายแพ็คเก็ต
Piotr Kula

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

ฉันใช้บีเกิลโบนแล้วก็ทำงานได้ดีขึ้น ปัญหาเกิดขึ้นเนื่องจากไดรเวอร์ USB ที่ไม่ดีสำหรับ RaspberryPi ใน Raspbian เท่าที่ฉันจำได้ฉันได้ทดสอบระบบเดียวกันกับ Raspbian รุ่นต่อมาและฉันมีขยะน้อยลง ฉันอาจอัปเดต rpi (ดังที่ได้กล่าวไว้ในคำตอบหนึ่ง) แต่ฉันจำไม่ได้ดี แต่สิ่งที่แน่นอนคือประสิทธิภาพการทำงานดีขึ้นหลังจากใช้เฟิร์มแวร์ / ระบบปฏิบัติการที่ได้รับการปรับปรุงแล้ว
Vincent Hiribarren

Vincent ฉันได้รับข้อผิดพลาด 'ไม่สามารถเปิด v4l2 url' ได้ คำสั่งนี้ล้าสมัยหรือไม่?
dalanmiller

คำตอบ:


6

ฉันมีปัญหาเดียวกันพบเธรดนี้เมื่อค้นหาตัวเข้ารหัสฮาร์ดแวร์ไม่ใช่ปัญหา c920

อย่างไรก็ตามดำเนินการอัพเดตเฟิร์มแวร์สำหรับราสเบอร์รี่ pi และขยะควรหายไป

$> sudo rpi-update

ฉันพบวิธีแก้ไขปัญหาด้วยตัวเองที่นี่: http://wiki.matthiasbock.net/index.php/Logitech_C920,_streaming_H.264#Raspberry_Pi


เพื่อปิดคำถามนี้ฉันยอมรับคำตอบนั้น ปัญหาเกิดขึ้นเนื่องจากไดรเวอร์ USB ที่ใช้งานไม่ได้มีการสูญหายของแพ็คเก็ตในการสื่อสาร USB ระบบ / เฟิร์มแวร์ที่ได้รับการอัปเดตควรทำการหลอกลวง
Vincent Hiribarren

2

คุณสามารถลองและใช้ FFMPEG แต่ปัญหาคือไม่ใช้รุ่นที่เก็บเพราะมันล้าสมัย มีเวอร์ชั่นที่แยกกันซึ่งทำงานได้ดีจริงๆ

คุณจะต้องรวบรวมมันซึ่งใช้เวลาประมาณ 5 ชั่วโมงหรือดาวน์โหลดไบนารีที่คอมไพล์แล้ว

จากนั้นคุณสามารถไพพ์ข้อมูลจากไดรเวอร์ V4L ไปยัง FFMPEG ด้วยการตั้งค่าเหล่านี้ ในกรณีที่ -i "fifo"ควรเพียงแค่-iทำการสตรีม piped และ-fคุณจะต้องตรวจสอบวิธีการส่งออก H264 อีกครั้ง FLV บรรจุมันลงใน FLV ที่สามารถเล่นกับผู้เล่น HTML

ffmpeg -y \  
  -f h264 \  
  -i "$fifo" \  
  -c:v copy \  
  -map 0:0 \  
  -f flv "$urllocal"   

หรือ exmaple ฉันพบว่าเป้าหมาย V4L โดยตรง แต่ oyu ต้องมีกล้องอยู่ใน/dev/video* ที่ * 1หรือมากกว่านั้น ...

ffmpeg -f video4linux2 -r 25 -s 640x480 -i /dev/video0 out.avi

-fหมายถึงรูปแบบการส่งออกใน. มันไม่ได้หมายความว่ามันจะแปลงมันเหมือน H264 เพื่อ FLV เพียงแค่ได้รับการห่อในรูปแบบ FLV จากนั้นเปลี่ยนที่อยู่เป็น VLC player ของลูกค้า ตัวอย่างเช่น-f mpegts udp:192.168.1.19:1234

VLC ดูเหมือนจะทำงานได้ไม่ดีกับ Pi ฉันประสบความสำเร็จเพียงเล็กน้อยในการผลักดันโมดูล Pi cmaera ไปยังพีซีของฉันโดยใช้ UDP มันใช้งานได้ แต่มันไม่เสถียร

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


1
เวอร์ชันที่แยกออกเป็นรุ่นใดที่ใช้งานได้ดี
Brian

1

ดูเหมือนว่าจะใช้งานได้กับฉัน @ อย่างน้อย ... cvlc v4l2:// :v4l2-dev=/dev/video0 :v4l2-width=640 :v4l2-height=480 --sout="#transcode{vcodec=h264,vb=800,scale=1,acodec=mp4a,ab=128,channels=2,samplerate=44100}:rtp{sdp=rtsp://:8554/live.ts}" -I dummy


0

ลองใช้บัฟเฟอร์ที่ใหญ่ขึ้นบนไคลเอนต์ที่แสดงวิดีโอ สำหรับฉันมีความแตกต่างอย่างมากระหว่างบัฟเฟอร์ 1,000ms และบัฟเฟอร์ 200ms บัฟเฟอร์ 5000ms ดูดีกว่าบัฟเฟอร์ 1000ms

: เครือข่ายแคช = 2000


มันควรทำงานกับการแคช 0 ด้วยการกระวนกระวายใจแปลก ๆ บน LAN.I ได้โมดูลกล้อง Pi ให้ทำงานเช่นนั้นโดยไม่มีปัญหา
Piotr Kula

0

ฉันโพสต์วิธีแก้ปัญหาที่เป็นไปได้ในฟอรัมราสเบอร์รี่โดยใช้เซิร์ฟเวอร์ RTSP น้ำหนักเบาที่ใช้live555ที่จับ H264 จากไดรเวอร์ V4L2 มีให้จาก github h264_v4l2_rtspserver

สิ่งนี้ทำเพื่อ raspicamera แต่มันควรจะทำงานกับอุปกรณ์ V4L2 ที่ให้ H264


-1

ถ้าฉันเข้าใจสถานการณ์ของคุณเป็นอย่างดีคุณต้องการให้ Raspberry แปลงรหัสวิดีโอเป็น H264 หรือไม่? ฉันคิดว่านั่นเป็นเหตุผลที่คุณได้รับประสิทธิภาพที่ไม่ดีเพราะ VLC ใช้การเข้ารหัสซอฟต์แวร์และ Raspberryis ไม่มีประสิทธิภาพสำหรับงานนั้น

ฉันจะแนะนำให้ไปลองกับGStreamer และgst-omxปลั๊กอิน มีองค์ประกอบสำหรับการเข้ารหัสวิดีโอฮาร์ดแวร์ที่จะทำให้เซิร์ฟเวอร์ที่ดีจาก Raspberry ของคุณ


1
อย่างที่เขาบอกว่ากล้อง Logitech ให้ H.264 เรียบร้อยแล้ว ดังนั้น rPi จึงทำการขนส่งเฟรมเท่านั้น แต่ไม่ทำการเข้ารหัสใด ๆ
Matthias

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