如何使用 ffmpeg 将原始视频通过管道传输到 v4l2loopback?

How to pipe rawvideo to v4l2loopback using ffmpeg?

我正在尝试通过 OpenCV 在 Python 中处理视频,然后将每一帧发送到虚拟相机(即 v4l2loopback)。我看到过询问将 OpenCV 输出传输到 ffmpeg 并保存到文件中的问题,以及使用 ffmpeg 将视频文件传输到 v4l2 的其他问题,但毫无疑问这两者在哪里结合。我可以单独做以上两件事,但不能同时做。

我的 Python 代码使用子进程将每个帧通过管道传输到 ffmpeg。将 OpenCV 的输出通过管道传输到 .mp4 文件的 ffmpeg 命令是

ffmpeg -y -f rawvideo -vcodec rawvideo -s 1280x720 -pix_fmt bgr24 -i - -vcodec libx264 -crf 0 -preset fast output.mp4

这个有效,我已经测试过了。

将视频文件通过管道传输到 v4l2 虚拟摄像机的 ffmpeg 命令是

ffmpeg -re -i input.mp4 -map 0:v -f v4l2 /dev/video0

这也行,我已经测试过了。

我试着结合上面的两个命令,想出了

ffmpeg -y -f rawvideo -vcodec rawvideo -s 1280x720 -pix_fmt bgr24 -i - -vcodec libx264 -crf 0 -preset fast -map 0:v -f v4l2 /dev/video0

但我收到以下错误

[NULL @ 0x55a12fcc60] Unable to find a suitable output format for '' : Invalid argument

如果有人能帮我解决这个问题,我会很高兴。

谢谢。

我在这里看到两个问题:

  1. Unable to find a suitable output format 错误可能来自您代码中命令中的 quotation/escaping 问题。 运行 来自命令行界面的相同命令正确执行。

  2. 修复引用问题后,您将收到另一个错误:V4L2 output device supports only a single raw video stream。这意味着您不能使用 libx264 输出到 v4l2。所以改为让它自动选择原始视频输出:

    ffmpeg -y -f rawvideo -video_size 1280x720 -pixel_format bgr24 -i - -f v4l2 /dev/video0

如果颜色看起来不对,请使用不同的 -pixel_format 值(参见 ffmpeg -pix_fmts),或者播放器不支持 v4l2 使用的输出像素格式。在这种情况下,添加 -vf format=yuv420p 输出选项(在 -i 之后和 /dev/video0 之前的任何位置)。

更多信息: