我有一个简单的设置,只有一个网络摄像头。我需要同时在两个工具中使用它,所以我决定用 gstreamer 复制它。由于它真的很乱,我很快就切换到了 ffmpeg,在那里我得到了更好的结果。
我有一个 1920x1080 30f 输入流,它应该转换为:
- 1920x1080 30f
- 1280x720 30f
我已经加载了 v4l2loopback:
$ cat /etc/modprobe.d/v4l2loopback.conf
options v4l2loopback devices=3
options v4l2loopback card_label="OBS Virtual Camera,Clone,720p"
options v4l2loopback exclusive_caps=1
我的网络摄像头可以使用服务格式:
$ v4l2-ctl --list-formats -d /dev/video0
ioctl: VIDIOC_ENUM_FMT
Type: Video Capture
[0]: 'YUYV' (YUYV 4:2:2)
[1]: 'MJPG' (Motion-JPEG, compressed)
[2]: 'M420' (YUV 4:2:0 (M420))
但是如果我使用 --list-formats-ext 检查,只有 mjpeg 可以在 1080p 上达到 30fps。
我的命令结果是:
ffmpeg -f v4l2 -video_size 1920x1080 -input_format mjpeg -i /dev/video0 -c:v copy -f v4l2 /dev/video4 -vcodec mjpeg -pix_fmt yuvj420p -vf scale=1280:720 -f v4l2 /dev/video5
复制版本看起来很棒,应该如此。但缩放版本像素化严重。我想可能是因为 mjpeg 编解码器加倍了。
这是没有任何缩放的,窗口处于其原始分辨率。如果我使用以下命令直接从相机获取 720p,您会看到差异:
ffmpeg -f v4l2 -video_size 1280x720 -input_format mjpeg -i /dev/video0 -c:v copy -f v4l2 /dev/video5
有人知道如何修复它吗,以便我在复制流时获得几乎与第二张图像相同的视频质量?