V4L2 एक कम विज्ञापित फ्रेम दर का उपयोग नहीं करता है


1

मैं लिनक्स पर चित्र कैप्चर कर रहा हूं (Pi 3B +, स्ट्रेच लाइट)। कैमरा रिपोर्ट करता है कि यह 30 एफपीएस या 60 एफपीएस पर चित्र देने में सक्षम है। यहाँ से आउटपुट हैv4l2-ctl

v4l2-ctl --list-formats-ext
ioctl: VIDIOC_ENUM_FMT
        Index       : 0
        Type        : Video Capture
        Pixel Format: 'YU12'
        Name        : Planar YUV 4:2:0
                Size: Discrete 640x512
                        Interval: Discrete 0.017s (60.000 fps)
                        Interval: Discrete 0.033s (30.000 fps)

        Index       : 1
        Type        : Video Capture
        Pixel Format: 'Y16 '
        Name        : 16-bit Greyscale
                Size: Discrete 640x512
                        Interval: Discrete 0.017s (60.000 fps)
                        Interval: Discrete 0.033s (30.000 fps)

        Index       : 2
        Type        : Video Capture
        Pixel Format: 'NV12'
        Name        : Y/CbCr 4:2:0
                Size: Discrete 640x512
                        Interval: Discrete 0.017s (60.000 fps)
                        Interval: Discrete 0.033s (30.000 fps)

        Index       : 3
        Type        : Video Capture
        Pixel Format: ''
        Name        : 3132564e-0000-0010-8000-00aa003
                Size: Discrete 640x512
                        Interval: Discrete 0.017s (60.000 fps)
                        Interval: Discrete 0.033s (30.000 fps)

लेकिन अगर मैं 30fps तक बदलने की कोशिश करूँ तो:

v4l2-ctl -d /dev/video0 --set-parm=30 --set-fmt-video=width=640,height=512,pixelformat="Y16 " --stream-mmap --stream-count=240 --stream-to=video.raw
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 59.40 fps
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 59.70 fps

फ़्रेमरेट को केवल अनदेखा किया जाता है।

मैं इसका उपयोग करके सत्यापित कर सकता हूं usbmon(भयानक टूल):

60 पर कब्जा:

Bus ID 1 (USB bus number 1)     To device       From device
  Device ID 1 :                 0.00 kb/s       0.00 kb/s
  Device ID 2 :                 0.00 kb/s       0.00 kb/s
  Device ID 3 :                 0.00 kb/s       0.00 kb/s
  Device ID 4 :                 0.00 kb/s       0.00 kb/s
  Device ID 6 :                 155.67 kb/s     39075.21 kb/s

"30" पर कब्जा:

Bus ID 1 (USB bus number 1)     To device       From device
  Device ID 1 :                 0.00 kb/s       0.00 kb/s
  Device ID 2 :                 0.00 kb/s       0.00 kb/s
  Device ID 3 :                 0.00 kb/s       0.00 kb/s
  Device ID 4 :                 0.00 kb/s       0.00 kb/s
  Device ID 6 :                 148.34 kb/s     39056.18 kb/s

यह प्रति सेकंड 640x512x2x60 = 39.3 एमबी के अनुरूप है।

समस्या यह है कि यदि कैमरा 60fps का उपयोग करने के लिए खुद को मजबूर कर रहा है, तो यह जरूरत से ज्यादा बस बैंडविड्थ आवंटित कर रहा है (और अन्य कैमरे नहीं चलेंगे क्योंकि वे दावा करते हैं कि पर्याप्त बैंडविड्थ स्पेयर नहीं है)। इसलिए जब मैं स्ट्रीम को गला सकता हूँ, तो हार्डवेयर स्तर पर यह मदद नहीं करता है।

Gstreamer या तो काम नहीं करता है, लेकिन मुझे लगता है क्योंकि यह कैप्चर करने के लिए V4L2 का उपयोग कर रहा है। उदाहरण के लिए:

timeout 15s gst-launch-1.0 -v v4l2src device=/dev/video0 ! video/x-raw,format=GRAY16_LE,framerate=30/1 ! videoconvert ! filesink location=video_30.raw

क्या कोई अन्य वीडियो बैकएंड है जिसे मैं आज़मा सकता हूं? या फ्रैमरेट सेट करने का एक बेहतर तरीका है?


मैं डिबग प्रिंट के साथ v4l-utils संकलित करूंगा, विशेष रूप से जाँच कर रहा हूं कि ioctl VIDIOC_S_PARMसफल था।
३६ पर dafnahaktana
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.