ฉันจะรับ Raspivid เพื่อข้ามการเข้ารหัส h264 ได้อย่างไร (กำจัดวิดีโอสตรีมมิ่งความล่าช้า 5 วินาที)


11

มี gazillions ของฟอรัมและกระทู้เกี่ยวกับการกำจัด latency 5 วินาทีเมื่อใช้ Pi ร่วมกับ PI-Cam เป็นกล้องวงจรปิด บทเรียนจำนวนมากแสดงวิธีใช้ vlc เพื่อเข้ารหัสและสตรีมรูปภาพโดยใช้โปรโตคอล RTP ซึ่งทำให้เกิดความล่าช้าประมาณ 5 วินาที

ตามที่ฉันบอกเหตุผลก็คือว่า raspivid กำลังเข้ารหัสสตรีมไปที่ H264 ในขณะที่ VLC ต้องถอดรหัสอีกครั้งและเข้ารหัสอีกครั้งกับ RTP ใดก็ตาม commandline มีลักษณะดังนี้:

raspivid -w 640 -h 480 -o - -t 0 |cvlc -vvv stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8554/}' :demux=h264

ส่วนแรกบอกให้ raspivid ส่งกระแสข้อมูลวิดีโอไปยังเอาต์พุตมาตรฐาน:

raspivid -w 640 -h 480 -o - -t 0 

ส่วนหลังท่อบอกให้ VLC ยกมาแล้วถอดรหัสโดยใช้ h264:

cvlc -vvv stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8554/}' :demux=h264

mux-ing และ demux-ing นี้ค่อนข้างเป็นแหล่งทรัพยากร!

ฉันพบแหล่งที่มาของ raspicamที่ github และฉันคิดว่าบางสิ่งสามารถทำได้ใน encoder_buffer_callback วิธี (ปัจจุบันที่บรรทัด 848) เพื่อข้ามการเข้ารหัส อย่างไรก็ตามฉันไม่เก่งที่ c และไม่คุ้นเคยกับการเข้ารหัสวิดีโอเลยดังนั้นฉันจึงไม่มีเงื่อนงำที่จะเริ่มต้น

บน Github ฉันเห็น 330 forks แต่พวกมันดูเหมือนจะไม่เฉพาะสำหรับ raspicam (สำหรับโครงการ userland ทั้งหมด) ฉันหลงทางเพื่อหาทางแยกที่ลบการเข้ารหัสหรือนำสิ่งที่ง่ายกว่าเช่น mjpeg มาใช้

ใครบ้างที่มีความรู้เกี่ยวกับตัวแปลงสัญญาณ c และวิดีโอสามารถช่วยฉันและผู้ใช้ gazillion คนอื่น ๆ เพื่อกำจัดความล่าช้าได้หรือไม่? อาจเป็นทางออกที่มีอยู่แล้วในหนึ่งในส้อมเหล่านั้น แต่ฉันใช้เวลาหลายชั่วโมงในการค้นหาโดยไม่ต้องโชคใด ๆ

ป.ล. ฉันไม่ได้กำลังมองหาโซลูชันเบราว์เซอร์แต่ในที่สุดฉันต้องการที่จะสตรีมไปที่ Synology โดยเฉพาะอย่างยิ่งการใช้การสตรีม mjpeg (แต่ไม่ใช่ผ่านหน้าเว็บแทนที่จะเป็นสตรีม mjpeg มาตรฐานที่สร้างขึ้นใน ip-cams เชิงพาณิชย์) ขั้นตอนแรกคือการกำจัด h264


นั่นคือการสอบสวนอย่างละเอียดมาก การใช้ MJPEG นั้นเป็นไปไม่ได้เพราะ (ในขณะที่ฉันกำลังมองหา) ตัวเข้ารหัส JPEG ในตัวไม่มีไลบรารีและซอฟต์แวร์เป็นขยะ ฉันจัดการเพื่อให้เกิดความล่าช้าประมาณ 1 วินาทีโดยใช้ nginx-rtmp (แพ็คเกจ FLV) การสร้างที่กำหนดเองในรูปแบบ HD! Pi ใช้ CPU ประมาณ 30% แต่ VLC พยายามที่จะถอดรหัสเพราะช่วงเวลาที่ขาดหายไปและเนื่องจากมันเป็น FLV :( ซอฟต์แวร์กล้องวงจรปิดของฉันใช้ VLC sink และสตรีม 1 720p ใช้ CPU 40% เมื่อฉันได้ทำงาน แต่ในที่สุด ไม่แน่นอน
Piotr Kula

@ppumkin ฉันไม่เชื่อว่า MJPEG ไม่เป็นปัญหา เมื่อ H264 หายไปเราสามารถเข้ารหัสสิ่งที่เราต้องการโดยไม่ต้องมีค่าใช้จ่ายในการถอดรหัสและการเข้ารหัสอีกครั้ง จริงๆแล้วการมี H264 นั้นค่อนข้างหรูหรา! มีเพียงเราเท่านั้นที่สามารถปิดได้ มันเหมือนกับเบาะรองนั่งที่หรูหราและเพชรที่บุษบกไว้ในห้องสุขาที่คับแคบดังนั้นจึงไม่มีอะไรเหมาะสมในห้อง (ยกเว้นบางห้องที่เราสามารถกระโดดขึ้นลงเล็กน้อย) ... เมื่อคุณเปิดประตูคุณต้องปีนขึ้นไป มากกว่าที่เท้าแขนสูงและเมื่อคุณนั่งมีห้องสำหรับขาของคุณไม่ ...
หลุยส์ซอมเมอร์

ใช่ฉันเข้าใจสิ่งที่คุณหมายถึง ฉันใช้เวลาหลายวันพยายามรับ MJPEG ในคุณภาพที่ดีกับเซิร์ฟเวอร์ CCTV IP ของฉัน มีหลายสิ่งที่เปลี่ยนไป แต่การเข้ารหัส JPEG โดยตรงและการไพพ์ไปยังสตรีมนั้นไม่มีอยู่เนื่องจาก API ไม่พร้อมใช้งาน วิธีเดียวที่ฉันรู้คือซอฟต์แวร์และวิธีแก้ปัญหาที่ดีที่สุดที่ฉันพบคือ nginx-rtmp JPEG sink HLS สำหรับ iPhone ใช้งานได้ดีจริง ๆ แต่มันมีความล่าช้า 5s-10s :(
Piotr Kula

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

demux ไม่เหมือน decode ... โปรดตรวจสอบสิ่งนี้
Flash Thunder

คำตอบ:


5

นั่นอาจไม่ใช่สิ่งที่คุณต้องการจากคำตอบ แต่ฉันไม่แนะนำ VLC สตรีมมิ่งเลย ..

สำหรับโครงการโรงเรียนฉันลองตัวเลือกการสตรีม (บน RPi ด้วย!):

  • VLC
  • MJPEG
  • GStreamer

เมื่อใช้ VLC และ MJPEG (และที่รู้จักกันน้อยกว่านี้) ฉันมีเวลาแฝงระหว่าง 3 และ 5 วินาที ..
การใช้ GStreamer ไม่มีความล่าช้าและด้วยความละเอียดที่ดีที่สุด (และตัวเลือกอื่น ๆ อีกมากมาย)!
หากคุณกำลังสนใจคุณสามารถตรวจสอบออกที่นี่

และถ้าคุณจะใช้นี่คือท่อของฉัน:

raspivid -t 0 -w 640 -h 480 -fps 25 -b 1200000 -p 0,0,640,480 -o - | gst-launch-1.0 -v fdsrc ! h264parse ! rtph264pay config-interval=1 pt=96 ! gdppay ! tcpserversink host=YOUR_IP port=YOUR_PORT

1
ใช่ฉันได้ลองใช้ Gstreamer แล้วและใช้งานได้ดีเมื่อสตรีมมิ่งไปยังพีซีหรืออื่น ๆ แต่มันใช้งานไม่ได้กับซอฟต์แวร์บุคคลที่สามเช่น Synology DiskStation ดูเหมือน GStreamer จะนำ h264 สตรีมกลับมาใช้ใหม่และตัดโพรโทคอลการสตรีมไปรอบ ๆ โดยไม่ต้องถอดรหัสซึ่งเป็นโซลูชันที่ยอดเยี่ยม แต่น่าเสียดายสำหรับกรณีการใช้งานจำนวนน้อย ถ้าฉันต้องการเห็นสตรีมบนอุปกรณ์ Android ฉันต้องพัฒนาแอพของตัวเอง MJPEG ได้รับการสนับสนุนอย่างกว้างขวางมากขึ้นและฉันมั่นใจว่า Raspivid สามารถเปลี่ยนแปลงได้เพื่อข้ามการเข้ารหัสที่ไม่จำเป็นออกไปเป็น VLC หรือมากกว่านั้น ขอบคุณสำหรับเคล็ดลับ แต่อย่างใด
หลุยส์ซอมเมอร์

1
ฉันมีซินโนโลจี แต่ไม่ได้ลอง GStreamer กับมัน (ของฉันไม่แรงพอที่ฉันคิด) Btw เกี่ยวกับ Android คุณสามารถใช้ GStreamer ได้เช่นกัน! ฉันใช้มันสำหรับโครงการของฉันและมันทำงานได้ดี :)!
Val

ปัญหากับ gstreamer มันไม่ได้รวม timeframe ช่วงเวลาลงใน data frame และมันไม่สามารถใช้เป็น sink ได้ (ถึงแม้จะมีตัวเลือกเพิ่ม !!) :( มีสคริปต์ mod ที่พร้อมใช้งานไปป์ไลน์ แต่ฉันพบ gstreamer เพื่อ VLC 6 เดือนที่ผ่านมาเมื่อฉันกำลังมองหาที่จะทำกล้องวงจรปิด saome .. แต่มันไม่เคยทำงานได้อย่างน่าเชื่อถือ :(
Piotr Kula

@Val จริงมี SDK สำหรับ Android แต่มีผู้เล่น out-of-the-box ไม่มากนักใน play-store ที่รองรับไพพ์ไลน์เช่น gst-launch-1.0 -v tcpclientsrc host = 11.22.33.44 พอร์ต = 1234! gdpdepay! rtph264depay! avdec_h264! วิดีโอเกม! autovideosink sync = false สำหรับ iOS มีให้ใช้งานน้อยกว่า Synology เป็นฮับที่ยอดเยี่ยมที่รองรับอุปกรณ์หลักส่วนใหญ่สามารถทำการตรวจจับการเคลื่อนไหวการบันทึกและการแจ้งเตือนทั้งหมดนี้อยู่นอกกรอบ (และไม่มี SD- การ์ดรอบเอว)
Louis ซอมเมอร์

คุณยังใช้สิ่งนี้อยู่หรือไม่? มีไดรเวอร์ U4VL ใหม่ แต่ยังคงมีปัญหาความล่าช้าเช่นเดียวกันกับการสตรีม h264 ไปยัง VLC
Piotr Kula

0

บางคนทำงานอย่างหนักกับเรื่องนี้ตั้งแต่ฉันถามคำถามนี้ครั้งแรกและในเวลานี้มีตัวเลือกน้อย (แปลกที่ยังไม่มีใครตอบคำถามนี้เลย) ฉันได้ลองRaspberrIPCamและประสบความสำเร็จบ้าง แต่ดูเหมือนว่าแพ็คเก็ต rtsp มี TTL สั้นมากหรือบางอย่าง การให้ Pi เชื่อมต่อโดยตรงกับเราเตอร์ถัดจากพีซีของฉันมันจะทำงานได้อย่างสมบูรณ์แบบ แต่ทันทีที่ฉันติดตั้งลูกเบี้ยวที่ฉันต้องการและพยายามเข้าถึงสตรีมด้วยเราเตอร์สองตัวระหว่างกันไม่มีภาพมาถึง ฉันตรวจสอบซอร์สโค้ดและพบว่าตั้งค่า TTL เป็นค่าสูงสุด ฉันไม่เคยคิดออกอย่างสมบูรณ์

ขณะนี้ฉันอยากจะแนะนำRaspberryIPCamera ซึ่งมีส่วนต่อประสานผู้ใช้ที่ดี (ดูภาพหน้าจอ ) และยังมีภาพ SD-card สำเร็จรูปสำหรับมัน ฉันลองใช้การ์ด SD แต่กลับไปทำการติดตั้งด้วยตนเองตามที่อธิบายไว้ที่นี่พร้อมความสำเร็จที่ยิ่งใหญ่ (การตั้งค่าปัจจุบันของฉัน) คำแนะนำในการเชื่อมต่อกับ Synology DiskStation นั้นยังมีอยู่และทำงานได้อย่างสมบูรณ์บนระบบของฉัน ปัญหาเกี่ยวกับอิมเมจการ์ด SD คือฉันไม่สามารถขยายระบบไฟล์ให้เต็ม SD การ์ดได้ (ฉันต้องการเรียกใช้ข้อมูลอื่น ๆ เพื่อควบคุมรีเลย์บางส่วนผ่านหมุด GPIO)

วิธีการแก้ปัญหาข้างต้นใช้ส่วนประกอบของโครงการ UV4L เอกสารของโครงการ UV4L ในหน้านี้ยังกล่าวถึง:

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

ฉันยังไม่ได้ลองเลยทะเลสาบถึงแม้ว่า (ตั้งแต่ฉันไม่ต้องการทำให้เสียการตั้งค่าปัจจุบันของฉัน)


1
ไม่แน่ใจว่านี่เป็นปัญหาของคุณหรือไม่ แต่ถ้าคุณส่งการรับส่งข้อมูลแบบหลายผู้รับ RTSP ผ่านเราเตอร์ตรวจสอบให้แน่ใจว่าได้เปิดใช้งานการดักฟัง IGMP และตรวจสอบให้แน่ใจว่าพีซีของคุณไม่ปิดกั้นการสืบค้น IGMP จากเราเตอร์ มิฉะนั้นเราเตอร์จะไม่ตระหนักว่าพีซีของคุณกำลังพยายามรับแพ็คเก็ตดังนั้นมันจะไม่ส่งต่อไป
Malvineous
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.