just try grab video without any conversions and outputs
ffmpeg -hide_banner -pix_fmt mjpeg -i /dev/video0 -f null null
my output show 30 fps
Input #0, video4linux2,v4l2, from '/dev/video0':
Duration: N/A, start: 47004.319825, bitrate: N/A
Stream #0:0: Video: mjpeg (Baseline), yuvj422p(pc, bt470bg/unknown/unknown), 1280x720, 30 fps, 30 tbr, 1000k tbn, 1000k tbc
Stream mapping:
Stream #0:0 -> #0:0 (mjpeg (native) -> wrapped_avframe (native))
Press [q] to stop, [?] for help
Output #0, null, to 'null':
Metadata:
encoder : Lavf58.29.100
Stream #0:0: Video: wrapped_avframe, yuvj422p, 1280x720, q=2-31, 200 kb/s, 30 fps, 30 tbn, 30 tbc
Metadata:
encoder : Lavc58.54.100 wrapped_avframe
[null @ 0x55eb9d297b00] Application provided invalid, non monotonically increasing dts to muxer in stream 0: 159 >= 159
frame= 161 fps= 30 q=-0.0 Lsize=N/A time=00:00:05.40 bitrate=N/A speed=1.01x
possible problem for fps
- raw grub format
- additional conversion from over pixel format to other
- slow video output