如何使用 FFMPEG 和 V4L2 复制网络摄像头流-一个副本,一个缩放输出

如何使用 FFMPEG 和 V4L2 复制网络摄像头流-一个副本,一个缩放输出

我有一个简单的设置,只有一个网络摄像头。我需要同时在两个工具中使用它,所以我决定用 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 

使用上述命令播放网络摄像头的屏幕截图,无需缩放

有人知道如何修复它吗,以便我在复制流时获得几乎与第二张图像相同的视频质量?

答案1

喜欢@Rotem评论这里-q:v 2很有帮助。非常感谢!

相关内容