【问题标题】:How to pipe rawvideo to v4l2loopback using ffmpeg?如何使用 ffmpeg 将 rawvideo 传输到 v4l2loopback?
【发布时间】:2020-03-23 22:14:25
【问题描述】:

我正在尝试通过 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] 无法为 '' 找到合适的输出格式 : 无效参数

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

谢谢。

【问题讨论】:

    标签: python opencv ffmpeg v4l2


    【解决方案1】:

    我在这里看到两个问题:

    1. Unable to find a suitable output format 错误可能来自代码中命令中的引号/转义问题。从命令行界面运行相同的命令可以正常执行。

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

        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 之前的任意位置)。

    更多信息:

    【讨论】:

    • 感谢您的回答!为什么命令中还有 output.mp4?我只想输出到 v4l2 设备。
    • @sepehr78 我假设您想同时输出到 v4l2 和 mp4,因为您说“可以单独完成上述两件事,但不能结合起来。”。我会在没有 mp4 的情况下更新答案。
    • 我尝试了命令并且代码正在运行,并且似乎视频正在通过管道传输到 v4l2,但是我查看 v4l2 设备的输出,颜色非常失真。你认为为什么会这样?
    • @sepehr78 可能是错误的-pixel_format。有关列表,请参阅 ffmpeg -pix_fmts
    猜你喜欢
    • 2011-11-06
    • 2020-09-23
    • 1970-01-01
    • 2021-03-15
    • 1970-01-01
    • 1970-01-01
    • 2011-08-20
    • 2017-08-11
    • 2020-08-01
    相关资源
    最近更新 更多