ฉันได้รับ Pi B + และกล้อง Pi และตอนนี้ฉันกำลังพยายามค้นหาที่มีประสิทธิภาพมากที่สุด (CPU ต่ำ) และการกำหนดค่าความหน่วงแฝงต่ำที่สุดในการสตรีมวิดีโอที่เข้ารหัส H.264 จากกล้องไปยังเซิร์ฟเวอร์ที่บ้านของฉัน
ฉันได้อ่านสิ่งต่อไปนี้:
(ลิงก์ทั้งหมดใช้ 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 แต่อันหลังนั้นค่อนข้างมีประสิทธิภาพเนื่องจากมันไม่จำเป็นต้องผ่านเคอร์เนลอีกครั้งเนื่องจากไม่มีท่อระหว่างกระบวนการที่เกี่ยวข้อง
ตอนนี้ฉันมีคำถามบางอย่างเกี่ยวกับเรื่องนี้
วิธีหลังนี้ยังคงเป็นวิธีการล่าสุดในการรับ H264 จากกล้องอย่างมีประสิทธิภาพหรือไม่ ฉันได้อ่านเกี่ยวกับ
gst-omx
ซึ่งจะช่วยให้ท่อ GStreamer... video/x-raw ! omxh264enc ! ...
เช่น สิ่งนี้แตกต่างจากการใช้งานเพียงอย่างเดียวvideo/x-h264
หรืออาจมีประสิทธิภาพมากกว่านี้หรือไม่ ความแตกต่างคืออะไร?ฉันจะรู้ได้อย่างไรว่าปลั๊กอินการเข้ารหัส gstreamer ใดที่ใช้งานจริงเมื่อฉันใช้ไพพ์
video/x-h264 ...
ไลน์ นี่ดูเหมือนจะเป็นเพียงการระบุรูปแบบที่ฉันต้องการเมื่อเทียบกับส่วนอื่น ๆ ของไปป์ไลน์ที่ฉันระบุชื่อองค์ประกอบ (code) (เช่นh264parse
หรือfpsdisplaysink
) อย่างชัดเจนในคำตอบนี้ไปยังลิงค์ 1มิคาเอลLepistöกล่าว"ฉันออกหนึ่งตัวกรองผ่านไม่จำเป็นออกจากสตรีมมิ่งด้าน"หมายความว่าเขาตัดออกและ
gdppay
gdpdepay
พวกมันทำอะไร? ทำไมพวกเขาต้องการ? ฉันสามารถถอดพวกเขาออกจริง ๆ ?นอกจากนี้เขายังกล่าวว่าด้วยการระบุ
caps="application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264, payload=(int)96"
พารามิเตอร์สำหรับด้านudpsrc
ที่ได้รับเขาสามารถเริ่มต้น / ดำเนินการสตรีมมิ่งต่อในช่วงกลางของสตรีม ตัวพิมพ์ใหญ่เหล่านี้บรรลุอะไรทำไมตัวเลือกเฉพาะเหล่านี้ฉันสามารถอ่านเพิ่มเติมได้จากที่ใดเมื่อฉันทำสิ่งที่แนะนำในคำถาม 3 และ 4 (การเพิ่มการ
caps
ปล่อยgdppay
และgdpdepay
) การแฝงวิดีโอของฉันจะยิ่งแย่ลงมาก (และดูเหมือนว่าจะมีการสะสมความล่าช้าในการแฝงจะเพิ่มขึ้นเมื่อเวลาผ่านไปและหลังจากนั้นไม่กี่นาทีวิดีโอก็หยุด) ทำไมเป็นเช่นนั้น ฉันต้องการได้เวลาแฝงที่ฉันได้รับด้วยคำสั่งดั้งเดิม แต่ยังมีคุณสมบัติในการเข้าร่วมสตรีมได้ตลอดเวลาฉันอ่านแล้วว่า RTSP + RTP มักจะใช้ TCP และ UDP ร่วมกัน: TCP สำหรับการควบคุมข้อความและสิ่งอื่น ๆ ที่ต้องไม่หลงทางและ UDP สำหรับการส่งข้อมูลวิดีโอจริง ในการตั้งค่าด้านบนฉันใช้งานจริงหรือว่าฉันแค่ใช้ UDP เท่านั้น มันค่อนข้างทึบสำหรับฉันไม่ว่า gstreamer จะดูแลเรื่องนี้หรือไม่
ฉันจะขอบคุณคำตอบใด ๆ แม้แต่หนึ่งเดียวของคำถามเหล่านี้!
cat file | grep ...
grep ... file
ไปป์เพิ่มเลเยอร์อื่นของการคัดลอกไปยังและจากเคอร์เนลซึ่งสามารถวัดได้ง่ายโดยเฉพาะบนอุปกรณ์ที่มีแบนด์วิดท์หน่วยความจำต่ำ หาก gstreamer สามารถอ่านได้จากไฟล์อุปกรณ์อย่างรุนแรงทำไมไม่ใช้มันล่ะ เกี่ยวกับraspivid | cvlc
ข้อเสนอแนะของคุณ: ฉันใช้สิ่งนี้ก่อนที่จะเปลี่ยนไปใช้โซลูชันที่ใช้ gstreamer มันมีเวลาแฝงมากกว่า gstreamer มากถึง 3 วินาที (ฉันไม่รู้สาเหตุ)
cvlc
ใช้ ~ 45% แต่เพียงวิ่งผ่านไปป์ที่อัตราข้อมูลนั้น (โปรดจำไว้อีกครั้งว่าท่อไม่ทำให้ช้าลง ) จะแทบไม่ต้องขยับเข็มเลย ถูกใจ <5% มันไม่สำคัญเลยถ้าคุณต้องการทำสิ่งนี้อย่างมีประสิทธิภาพเท่าที่จะเป็นไปได้แน่นอน
raspivid | cvlc
อันที่ 40-50% ผู้คนอาจตอบคำถามที่ท้าทายให้พวกเขาปรับปรุงตัวเลขที่เฉพาะเจาะจงได้ดีขึ้น ตอนนี้คุณกำลังถามถึงสาเหตุมากมายโดยไม่อธิบายว่าทำไมแต่ละเหตุผลถึงสำคัญ
|
สร้างปัญหาใด ๆ ในบริบทนี้เป็นส่วนหนึ่งของ BS ที่เหลือเชื่อคุณเคยลองใช้raspivid | cvlc
วิธีการใดบ้างหรือไม่? ฉันไม่ได้มีกล้องเป็นเวลานานหรือนานมากที่จะเล่นกับมัน แต่การใช้มันเพื่อสร้างสตรีม http (ดูได้บน linux ที่ปลายอีกด้าน w /vlc
) ดูเหมือนว่าจะทำงานได้ดี