V4L2 не використовує нижчу рекламну частоту кадрів


1

Я знімаю зображення на Linux (Pi 3B +, Stretch lite). Камера повідомляє, що здатна видавати зображення зі швидкістю 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)

Але якщо я спробую змінити на 30 кадрів в секунду:

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 Мб в секунду.

Проблема полягає в тому, що якщо камера змушує використовувати 60 кадрів в секунду, вона виділяє більше пропускної здатності шини, ніж потрібно (а інші камери не працюватимуть, оскільки вони стверджують, що пропускної здатності не вистачає). Тож, хоча я можу заглушити потік, на апаратному рівні це не допоможе.

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 з налагодженнями відбитків, спеціально перевіряючи, чи VIDIOC_S_PARMбув ioctl успішним.
dafnahaktana
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.