0

我想将图像传送到虚拟视频设备(例如 /dev/video0),图像是在具有所需帧速率的循环内创建的。

在这个最小的例子中,我只有两个在 cv2 窗口中交替的数组。现在我寻找一个很好的解决方案来将阵列传输到虚拟设备。

我看到ffmpeg-python可以异步运行ffmpeg.run_async(),但到目前为止我无法使用这个包做任何事情。

没有 ffmpeg 东西的示例代码:

#!/usr/bin/env python3

import cv2
import numpy as np
import time

window_name = 'virtual-camera'
cv2.namedWindow(window_name, cv2.WINDOW_GUI_EXPANDED)

img1 = np.random.uniform(0, 255, (1080, 1440, 3)).astype('uint8')
img2 = np.random.uniform(0, 255, (1080, 1440, 3)).astype('uint8')

for i in range(125):
    time.sleep(0.04)
    if i % 2:
        img = img1
    else:
        img = img2
    cv2.imshow(window_name, img)
    cv2.waitKey(1)
cv2.destroyAllWindows()
4

2 回答 2

1

首先,您必须设置一个虚拟相机,例如v4l2loopback. 请参阅此处了解如何安装它(忽略使用示例)。
然后,您可以像写入普通文件一样写入虚拟相机(也就是说,让 openCV 将图像写入说/dev/video0;如何做到这一点您必须自己找出来,因为我不是 openCV 专家)。
最后,您可以使用ffmpeg-pythonwith/dev/video0作为输入文件,对视频做一些事情,就是这样!

于 2021-03-15T18:47:03.440 回答
1

正如程序员在他的回答中所写,可以使用包v4l2loopback创建一个虚拟设备。使用 ffmpeg 将图像、视频或桌面发布到虚拟设备已经很容易了,但我想将它直接从 python 脚本(我在其中捕获图像)通过管道传输到虚拟设备。我仍然认为ffmpeg-python是可能的,但我从 Alp 找到了这个很好的答案,它揭示了黑暗。pyfakewebcam包是该问题的完美解决方案。

为了完整起见,这是我扩展的最小工作示例:

#!/usr/bin/env python3

import time

import cv2
import numpy as np
import pyfakewebcam

WIDTH = 1440
HEIGHT = 1080
DEVICE = '/dev/video0'

fake_cam = pyfakewebcam.FakeWebcam(DEVICE, WIDTH, HEIGHT)

window_name = 'virtual-camera'
cv2.namedWindow(window_name, cv2.WINDOW_GUI_EXPANDED)

img1 = np.random.uniform(0, 255, (HEIGHT, WIDTH, 3)).astype('uint8')
img2 = np.random.uniform(0, 255, (HEIGHT, WIDTH, 3)).astype('uint8')

for i in range(125):
    time.sleep(0.04)
    if i % 2:
        img = img1
    else:
        img = img2
    fake_cam.schedule_frame(img)
    cv2.imshow(window_name, img)
    cv2.waitKey(1)
cv2.destroyAllWindows()
于 2021-03-16T08:39:53.050 回答