Я снимаю изображения на 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)
Но если я попытаюсь изменить на 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 МБ в секунду.
Проблема заключается в том, что если камера заставляет себя использовать скорость 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
Могу ли я попробовать другие видео-бэкенды? Или есть лучший способ установить частоту кадров?