ffmpeg - 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,它会更快吗?
解决方案
推荐阅读
- javascript - 我想将文件发送到 api url 并获得响应而不使用 ajax 重定向到它
- php - Laravel 5.7 - 使用 morphMany 关系和自定义属性获取器的渴望加载
- reactjs - 反应钩子渲染额外的时间
- python - 张量流移位图像和插值
- javascript - intersectionObserver - I would my slide stop to move when an option box reaches one of boundary-side of the container
- python - 检查 python 代码是否在 Linux 中作为后台任务运行
- excel - 在excel中通过公式绘制不同的形状
- ruby-on-rails - 创建带有脚手架的项目在创建后不显示属性 - Rails/Devise
- r - 为什么 NaN!=NaN 在 R 中返回 NA 而不是 TRUE
- swift - Xcode Firebase | 无法将类型“AuthDataResult”的值转换为预期的参数类型“用户”