【问题标题】:Pipe numpy array to virtual video device管道 numpy 数组到虚拟视频设备
【发布时间】:2021-06-12 18:01:56
【问题描述】:

我想将图像传送到虚拟视频设备(例如 /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()

【问题讨论】:

  • 这能回答你的问题吗? Pipe opencv images to ffmpeg using python
  • 接受的答案来自 2015 年,并使用 ffmpeg 作为子进程。我希望我可以避免这种情况并改用 ffmpeg-python。遗憾的是,该链接上的最后一个答案尚未完成。目标是视频设备,在vidgear 包中,您必须命名一个输出,在示例中为“output.mp4”,这不是我想要的,或者至少它令人困惑。
  • 好吧,我一开始没想到你想用 ffmpeg-python 来做这个。
  • 但是你为什么要在那里传输图像呢?
  • 我从另一个 python API 获取数组,并希望在扫描 /dev/video* 设备的不同 3rd 方应用程序(实时图片)中使用它们。所以我必须在这些边界之间工作。

标签: python-3.x ffmpeg v4l2 python-imageio ffmpeg-python


【解决方案1】:

正如Programmer 在他的回答中所写,可以使用包v4l2loopback 创建一个虚拟设备。使用 ffmpeg 将图像、视频或桌面发布到虚拟设备已经很容易了,但我想将它直接从 python 脚本(我在其中捕获图像)通过管道传输到虚拟设备。我仍然认为ffmpeg-python 是可能的,但我发现这个great answer from 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()

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 正确,我已经找到了您发布的链接,并且能够将保存的图像、视频和桌面传输到虚拟设备。但似乎我忘了提到我的问题是直接从 python 脚本管道到虚拟设备。这就是我寻找 ffmpeg-python 解决方案的原因。我找到了一个可行的解决方案并发布了答案。感谢程序员的建议和帮助!
    猜你喜欢
    • 1970-01-01
    • 2015-03-29
    • 1970-01-01
    • 1970-01-01
    • 2021-10-19
    • 1970-01-01
    • 1970-01-01
    • 2013-05-06
    • 2019-05-10
    相关资源
    最近更新 更多