![设置 v4l2 设备的输出帧率](https://linux22.com/image/180730/%E8%AE%BE%E7%BD%AE%20v4l2%20%E8%AE%BE%E5%A4%87%E7%9A%84%E8%BE%93%E5%87%BA%E5%B8%A7%E7%8E%87.png)
我正在使用v4l2loopback
v0.12.5 并wf-recorder
在 wayland 上录制我的屏幕。我希望降低浏览器读取的视频流的帧速率。目前我无法获得除 60fps 之外的任何内容。
我使用过版本 wf-recorder0.2.1
和这把叉子因为它添加了设置帧速率的选项。但是,我得到相同的输出。
如果我wf-recorder
从这个命令开始:
wf-recorder \
-x yuv420p \
-g "$x,$y ${width}x$height" \
--muxer=v4l2 \
--codec=rawvideo \
--file="$device"
/sys/devices/virtual/video4linux/video0/format
看起来像这样:
YU12:2560x1440@30
然而,命令输出报告帧率为 60 而不是 @30:
selected region 0 0 2560 1440
Framerate: 60
Choosing pixel format yuv420p
Output #0, video4linux2,v4l2, to '/dev/video0':
Stream #0:0: Unknown: none (rawvideo)
如果我打开设备,ffplay
我会看到它报告 30fps:
Input #0, video4linux2,v4l2, from '/dev/video0':B sq= 0B f=0/0
Duration: N/A, start: 1102.869115, bitrate: 1327104 kb/s
Stream #0:0: Video: rawvideo (I420 / 0x30323449), yuv420p, 2560x1440, 1327104 kb/s, 30 fps
使用webcamtests.com我收到~60fps 的报告。
如果我启动 wf-recorder 并将-r
标志设置为6
:
wf-recorder \
-x yuv420p \
-r 6 \
-g "$x,$y ${width}x$height" \
--muxer=v4l2 \
--codec=rawvideo \
--file="$device"
wf-recorder
Framerate: 6
然而报道/sys/devices/virtual/video4linux/video0/format
仍然显示YU12:2560x1440@30
。
这让我相信问题不在于wf-recorder
,或者更确切地说,我无法使用该工具设置帧速率。
相反,我希望更改设备上的设置。跑步:
echo "@6"| sudo tee /sys/devices/virtual/video4linux/video0/format
我看到格式更改为YU12:2560x1440@6
.然而,我认为感知的帧速率没有变化。
如果我运行:
sudo v4l2-ctl -d /dev/video0 -p 6
我看到格式更改为:YU12:2560x1440@6000/1000
但我再次看到感知帧速率没有变化(在我的浏览器中仍然是 60fps)。
内核模块上似乎没有为此设置任何选项v4l2loopback
。
我已经没有主意了 - 还有什么可以尝试的,或者我那台可怜的计算机注定只能永远处理 100Mbit 视频流吗? :D
答案1
最后我能够使用另一个 v4l 设备和这个 gstreamer 命令来做到这一点:
gst-launch-1.0 -v v4l2src device=/dev/video0 ! videorate drop-only=true ! video/x-raw,framerate=6/1 ! v4l2sink device=/dev/video1
答案2
在启动之前,我可以通过在 v4l2loopback 设备上设置它来将每秒帧数限制为 10 wf-recorder
。
v4l2-ctl -d /dev/video6 --set-parm 10
执行此操作后播放流ffplay /dev/video6
确认了设置:
Stream #0:0: Video: rawvideo (I420 / 0x30323449), yuv420p, 2560x1410, 433152 kb/s, 10 fps, 10 tbr, 1000k tbn, 1000k tbc
关于此设置的帮助输出v4l2-ctl
如下:
$ v4l2-ctl --help-all
...
-P, --get-parm display video parameters [VIDIOC_G_PARM]
-p, --set-parm <fps>
set video framerate in <fps> [VIDIOC_S_PARM]
...