วิธีใหม่ในการสตรีม H.264 จาก Raspberry Cam


16

ฉันได้รับ Pi B + และกล้อง Pi และตอนนี้ฉันกำลังพยายามค้นหาที่มีประสิทธิภาพมากที่สุด (CPU ต่ำ) และการกำหนดค่าความหน่วงแฝงต่ำที่สุดในการสตรีมวิดีโอที่เข้ารหัส H.264 จากกล้องไปยังเซิร์ฟเวอร์ที่บ้านของฉัน

ฉันได้อ่านสิ่งต่อไปนี้:

  1. http://pi.gbaman.info/?p=150

  2. http://blog.tkjelectronics.dk/2013/06/how-to-stream-video-and-audio-from-a-raspberry-pi-with-no-latency/comment-page-1/#comments

  3. http://www.raspberrypi.org/forums/viewtopic.php?p=464522

(ลิงก์ทั้งหมดใช้ gstreamer-1.0 จากdeb http://vontaene.de/raspbian-updates/ . main)

เรื่องนี้เกิดขึ้นมากมายในหลายปีที่ผ่านมา

เดิมทีเราต้องไปป์ผลลัพธ์ของการraspividเข้าไปgst-launch-1.0(ดูลิงค์ 1)

จากนั้น (2) โปรแกรมควบคุม V4L2 อย่างเป็นทางการที่ถูกสร้างขึ้นซึ่งขณะนี้มาตรฐานและจะช่วยให้เพื่อให้ได้ข้อมูลโดยไม่ต้องท่อโดยตรงโดยใช้เพียง GStreamer (ดูโดยเฉพาะอย่างยิ่งการโพสต์โดย towolf »เสาร์ 7 ธันวาคม 2013 03:34ในการเชื่อมโยง 2):

ผู้ส่ง (Pi): gst-launch-1.0 -e v4l2src do-timestamp=true ! video/x-h264,width=640,height=480,framerate=30/1 ! h264parse ! rtph264pay config-interval=1 ! gdppay ! udpsink host=192.168.178.20 port=5000

ผู้รับ: gst-launch-1.0 -v udpsrc port=5000 ! gdpdepay ! rtph264depay ! avdec_h264 ! fpsdisplaysink sync=false text-overlay=false

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


ตอนนี้ฉันมีคำถามบางอย่างเกี่ยวกับเรื่องนี้

  1. วิธีหลังนี้ยังคงเป็นวิธีการล่าสุดในการรับ H264 จากกล้องอย่างมีประสิทธิภาพหรือไม่ ฉันได้อ่านเกี่ยวกับgst-omxซึ่งจะช่วยให้ท่อ GStreamer ... video/x-raw ! omxh264enc ! ...เช่น สิ่งนี้แตกต่างจากการใช้งานเพียงอย่างเดียวvideo/x-h264หรืออาจมีประสิทธิภาพมากกว่านี้หรือไม่ ความแตกต่างคืออะไร?

  2. ฉันจะรู้ได้อย่างไรว่าปลั๊กอินการเข้ารหัส gstreamer ใดที่ใช้งานจริงเมื่อฉันใช้ไพพ์video/x-h264 ...ไลน์ นี่ดูเหมือนจะเป็นเพียงการระบุรูปแบบที่ฉันต้องการเมื่อเทียบกับส่วนอื่น ๆ ของไปป์ไลน์ที่ฉันระบุชื่อองค์ประกอบ (code) (เช่นh264parseหรือfpsdisplaysink) อย่างชัดเจน

  3. ในคำตอบนี้ไปยังลิงค์ 1มิคาเอลLepistöกล่าว"ฉันออกหนึ่งตัวกรองผ่านไม่จำเป็นออกจากสตรีมมิ่งด้าน"หมายความว่าเขาตัดออกและgdppay gdpdepayพวกมันทำอะไร? ทำไมพวกเขาต้องการ? ฉันสามารถถอดพวกเขาออกจริง ๆ ?

  4. นอกจากนี้เขายังกล่าวว่าด้วยการระบุcaps="application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264, payload=(int)96"พารามิเตอร์สำหรับด้านudpsrcที่ได้รับเขาสามารถเริ่มต้น / ดำเนินการสตรีมมิ่งต่อในช่วงกลางของสตรีม ตัวพิมพ์ใหญ่เหล่านี้บรรลุอะไรทำไมตัวเลือกเฉพาะเหล่านี้ฉันสามารถอ่านเพิ่มเติมได้จากที่ใด

  5. เมื่อฉันทำสิ่งที่แนะนำในคำถาม 3 และ 4 (การเพิ่มการcapsปล่อยgdppayและgdpdepay) การแฝงวิดีโอของฉันจะยิ่งแย่ลงมาก (และดูเหมือนว่าจะมีการสะสมความล่าช้าในการแฝงจะเพิ่มขึ้นเมื่อเวลาผ่านไปและหลังจากนั้นไม่กี่นาทีวิดีโอก็หยุด) ทำไมเป็นเช่นนั้น ฉันต้องการได้เวลาแฝงที่ฉันได้รับด้วยคำสั่งดั้งเดิม แต่ยังมีคุณสมบัติในการเข้าร่วมสตรีมได้ตลอดเวลา

  6. ฉันอ่านแล้วว่า RTSP + RTP มักจะใช้ TCP และ UDP ร่วมกัน: TCP สำหรับการควบคุมข้อความและสิ่งอื่น ๆ ที่ต้องไม่หลงทางและ UDP สำหรับการส่งข้อมูลวิดีโอจริง ในการตั้งค่าด้านบนฉันใช้งานจริงหรือว่าฉันแค่ใช้ UDP เท่านั้น มันค่อนข้างทึบสำหรับฉันไม่ว่า gstreamer จะดูแลเรื่องนี้หรือไม่

ฉันจะขอบคุณคำตอบใด ๆ แม้แต่หนึ่งเดียวของคำถามเหล่านี้!


แนวคิดที่ว่าการใช้ไปป์|สร้างปัญหาใด ๆ ในบริบทนี้เป็นส่วนหนึ่งของ BS ที่เหลือเชื่อคุณเคยลองใช้raspivid | cvlcวิธีการใดบ้างหรือไม่? ฉันไม่ได้มีกล้องเป็นเวลานานหรือนานมากที่จะเล่นกับมัน แต่การใช้มันเพื่อสร้างสตรีม http (ดูได้บน linux ที่ปลายอีกด้าน w / vlc) ดูเหมือนว่าจะทำงานได้ดี
goldilocks

@goldilocks ฉันไม่ได้บอกว่าท่อเป็น "ปัญหา" เพียงแค่ว่ามันไม่ได้เป็นสิ่งที่จำเป็นและมีค่าใช้จ่ายบางส่วนเช่นเดียวแทนcat file | grep ... grep ... fileไปป์เพิ่มเลเยอร์อื่นของการคัดลอกไปยังและจากเคอร์เนลซึ่งสามารถวัดได้ง่ายโดยเฉพาะบนอุปกรณ์ที่มีแบนด์วิดท์หน่วยความจำต่ำ หาก gstreamer สามารถอ่านได้จากไฟล์อุปกรณ์อย่างรุนแรงทำไมไม่ใช้มันล่ะ เกี่ยวกับraspivid | cvlcข้อเสนอแนะของคุณ: ฉันใช้สิ่งนี้ก่อนที่จะเปลี่ยนไปใช้โซลูชันที่ใช้ gstreamer มันมีเวลาแฝงมากกว่า gstreamer มากถึง 3 วินาที (ฉันไม่รู้สาเหตุ)
nh2

ใช่มันมีความล่าช้าอย่างแน่นอน WRT the pipe ประเด็นของฉันเกี่ยวกับ "บริบท" คือสิ่งนี้ไม่สามารถเป็นคอขวดได้ที่นี่ - เครือข่าย I / O กำลังจะเป็นคำสั่งที่มีขนาดช้าลง ฯลฯ คุณพูดถูก แต่อาจเพิ่มซีพียูเล็กน้อย เวลา. ฉันแค่เดิมพันไม่มาก ใช้งานที่ความละเอียดสูงสุดcvlcใช้ ~ 45% แต่เพียงวิ่งผ่านไปป์ที่อัตราข้อมูลนั้น (โปรดจำไว้อีกครั้งว่าท่อไม่ทำให้ช้าลง ) จะแทบไม่ต้องขยับเข็มเลย ถูกใจ <5% มันไม่สำคัญเลยถ้าคุณต้องการทำสิ่งนี้อย่างมีประสิทธิภาพเท่าที่จะเป็นไปได้แน่นอน
goldilocks

... ฉันไม่ต้องการให้ใครอื่นอ่านข้อความนี้เพื่อรับความประทับใจว่าการใช้ไพพ์ที่นี่อาจเป็นสาเหตุของปัญหาความล่าช้าหรือปัญหาอื่น ๆ นั่นคือปลาเฮอริ่งแดง หรือฉันอาจผิด;)
goldilocks

หากประสิทธิภาพของคุณเป็นไปตามนั้นคุณอาจต้องการรวมการใช้งาน CPU ทั้งหมดที่สังเกตได้สำหรับวิธีการต่างๆในอัตราความละเอียด / เฟรมเฉพาะ อันเดียวที่ฉันได้ลองคือraspivid | cvlcอันที่ 40-50% ผู้คนอาจตอบคำถามที่ท้าทายให้พวกเขาปรับปรุงตัวเลขที่เฉพาะเจาะจงได้ดีขึ้น ตอนนี้คุณกำลังถามถึงสาเหตุมากมายโดยไม่อธิบายว่าทำไมแต่ละเหตุผลถึงสำคัญ
goldilocks

คำตอบ:


8

ตัวเลือก:

  1. raspivid -t 0 -o - | nc -k -l 1234

  2. raspivid -t 0 -o - | cvlc stream:///dev/stdin --sout "#rtp{sdp=rtsp://:1234/}" :demux=h264

  3. cvlc v4l2:///dev/video0 --v4l2-chroma h264 --sout '#rtp{sdp=rtsp://:8554/}'

  4. raspivid -t 0 -o - | gst-launch-1.0 fdsrc ! h264parse ! rtph264pay config-interval=1 pt=96 ! gdppay ! tcpserversink host=SERVER_IP port=1234

  5. gst-launch-1.0 -e v4l2src do-timestamp=true ! video/x-h264,width=640,height=480,framerate=30/1 ! h264parse ! rtph264pay config-interval=1 ! gdppay ! udpsink host=SERVER_IP port=1234

  6. uv4l --driver raspicam

  7. picam --alsadev hw:1,0

สิ่งที่ต้องพิจารณา

  • เวลาแฝง [ms] (โดยมีและไม่มีการขอให้ไคลเอ็นต์ต้องการ fps มากกว่าเซิร์ฟเวอร์)
  • CPU ว่าง [%] (วัดจากtop -d 10)
  • ลูกค้า CPU 1 [%]
  • RAM [MB] (RES)
  • การตั้งค่าการเข้ารหัสเดียวกัน
  • คุณสมบัติเดียวกัน
    • เสียง
    • เชื่อมต่อ
    • ไคลเอ็นต์อิสระของ OS (vlc, webrtc, ฯลฯ )

เปรียบเทียบ:

            1    2    3    4    5    6    7
latency     2000 5000 ?    ?    ?    ?    1300
CPU         ?    1.4  ?    ?    ?    ?    ?
CPU 1       ?    1.8  ?    ?    ?    ?    ?
RAM         ?    14   ?    ?    ?    ?    ?
encoding    ?    ?    ?    ?    ?    ?    ?
audio       n    ?    ?    ?    ?    y    ?
reconnect   y    y    ?    ?    ?    y    ?
any OS      n    y    ?    ?    ?    y    ?
latency fps ?    ?    ?    ?    ?    ?    ?

1
ทำไมค่าทั้งหมดในตารางนี้ " ?"
larsks

@larsks เนื่องจากไม่มีใครสนใจที่จะทดสอบและกรอกข้อมูลใน 'community wiki' นี้
user1133275

6

วิธีเดียวที่ทันสมัยในการสตรีม H264 ไปยังเบราว์เซอร์คือด้วยUV4L : ไม่มีความหน่วงแฝงไม่มีการกำหนดค่าพร้อมเสียงเสริมทางเลือกเสียง / วิดีโอสองทางเลือก ไม่มีเวทย์มนตร์ GStreamer ซอส แต่มันเป็นไปได้ที่จะขยายการใช้งาน


เนื่องจากฉันต้องการสตรีมไปยังเซิร์ฟเวอร์และสมาร์ทโฟนของฉันการสตรีมไปยังเบราว์เซอร์ไม่ใช่ข้อกำหนด นอกจากนี้เบราว์เซอร์อาจมีข้อ จำกัด เพิ่มเติมเกี่ยวกับมัน (เช่นไม่มี RTSP, อาจไม่มี TCP เว้นแต่คุณจะใช้ WebRTC แต่นั่นเป็นเรื่องตลก) แต่ UV4L ยังดูสดใสอยู่ คุณสามารถลิงก์ไปยังสถานที่ที่ฉันสามารถอ่านเกี่ยวกับวิธีใช้ / รับข้อมูลจากมันเพื่อสตรีมมิ่งผ่านเครือข่ายได้หรือไม่?
nh2

วัวศักดิ์สิทธิ์ฉันคิดว่าฉันพบหน้าตัวอย่าง ... สิ่งนี้ดูเหมือนว่าจะสามารถทำทุกอย่างได้ ! RTMP, RTSP, HTTPS สตรีมมิ่ง, WebRTC, "การตรวจจับวัตถุแบบเรียลไทม์และการติดตามวัตถุ + การตรวจจับใบหน้า" - อะไรที่นรก ?? แต่ละอันมีแฟล็กบรรทัดคำสั่งง่ายๆเป็นuv4l? ไปป์ไลน์ gstreamer ของฉันดูล้าสมัยแล้ว! อดใจรอไม่ไหวที่จะทดสอบว่าเวลาแฝงนั้นเป็นอย่างไร!
nh2

1
โอ้ไม่มันถูกปิดแหล่งที่มา :( นั่นตัดสิทธิ์มันสำหรับการเฝ้าระวังที่บ้านที่ฉันมีอยู่ในใจ :(
nh2

รองรับ WebRTC, WebRTC แบบสองทาง ความหน่วงแฝงอยู่ที่ ~ 200ms เสียง / วิดีโอ, เสียงอาจน้อยลง
prinxis

@ nh2 ดูเหมือนว่าลิงก์จะเสียหายคุณมีตำแหน่งที่อัปเดตสำหรับหน้าตัวอย่างนั้นหรือไม่
Punit Soni

1

1. ) h264es การสตรีมข้ามเครือข่าย (ตัวอย่างเท่านั้น)

บนเซิร์ฟเวอร์:

raspivid -v -a 524 -a 4 -a "rpi-0 %Y-%m-%d %X" -fps 15 -n -md 2 -ih -t 0 -l -o tcp://0.0.0.0:5001

บนลูกค้า:

mplayer -nostop-xscreensaver -nolirc -fps 15 -vo xv -vf rotate=2,screenshot -xy 1200 -demuxer h264es ffmpeg://tcp://<rpi-ip-address>:5001

2. ) mjpeg การสตรีมข้ามเครือข่าย (ตัวอย่างเท่านั้น)

บนเซิร์ฟเวอร์:

/usr/local/bin/mjpg_streamer -o output_http.so -w ./www -i input_raspicam.so -x 1920 -y 1440 -fps 3

บนลูกค้า:

mplayer -nostop-xscreensaver -nolirc -fps 15 -vo xv -vf rotate=2,screenshot -xy 1200 -demuxer lavf http://<rpi-ip-address>:8080/?action=stream

ทั้งหมดนี้ใช้งานได้กับ RPi Zero W (กำหนดค่าเป็นเซิร์ฟเวอร์)


เฮ้ขอบคุณสำหรับคำตอบของคุณsample onlyหมายความว่าอย่างไร
nh2

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