首页 > 解决方案 > FFMPEG 将数据从 dshow 相机中继到标准输出 PIPE 的瓶颈,无需任何处理或转换

问题描述

我有一个 USB 摄像头 (FSCAM_CU135),可以在内部将视频编码为 MJPEG,它支持 DirectShow。我的目标是按原样检索编码视频的二进制流(无需解码或预览)并将其发送到我的程序以进行进一步处理。

我选择使用 FFMPEG 读取 MJPEG 流并通过管道传输到标准输出,以便我可以使用 Python 的 subprocess.Popen 读取它。

ffmpeg -y -f dshow -vsync 2 -rtbufsize 1000M -video_size 1920x1440 -vcodec mjpeg -i video="FSCAM_CU135" -vcodec copy -f mjpeg pipe:1

在此分辨率下,相机能够以 60 fps 的速度进行捕捉和传输。在这种情况下,我希望 FFMPEG 尽可能快地传递数据而无需计算。通过 FFMPEG 的输出,我可以知道它将数据从 rtbuffer 移动到输出管道的速度有多快。

FFMPEG 只需一台摄像头就可以毫无问题地以 60 fps 的速度移动数据。但是,当我同时运行 2 个摄像头时,摄像头仍然以 60 fps 的速度生成数据,但 FFMPEG 只能以 55 fps 左右的速度移动数据。这意味着我无法实时消费视频,并且随着时间的推移缓冲区消耗会更大。

我猜 FFMPEG 不只是简单地移动数据,而是做了一些处理,例如搜索每个视频帧的开始、结束和时间戳,以便它可以计数帧并报告。有没有办法强制 FFMPEG 不做这些事情,只专注于传递数据以使其更快?

如果我纯粹使用没有 FFMPEG 的 directshow API,它会更快吗?

标签: ffmpegpipewebcamdirectshowmjpeg

解决方案


推荐阅读