用于格式转换/简单转换的 FFMpeg 与 OpenCV

Posted

技术标签:

【中文标题】用于格式转换/简单转换的 FFMpeg 与 OpenCV【英文标题】:FFMpeg vs. OpenCV for format conversion/simple transformation 【发布时间】:2019-06-26 01:34:17 【问题描述】:

我必须创建一个可以实时处理图像的系统。我已经用 C++ 实现了一个像素格式转换系统,它也可以进行一些简单的转换(目前:旋转和镜像)。

系统的输入/输出格式为以下格式的帧:

RGB (24, 32) YUYV420, YUYV 422 JPEG 原始灰度

例如,一个操作可以是:

YUYV422 -> 旋转 90 -> 翻转水平 -> RGB24 灰度 -> 旋转 270 -> 翻转垂直 -> YUYV420

系统的目标是为旋转/镜像和像素格式转换提供最佳性能。我目前的实现依赖于 OpenCV,但在处理超过 2k 分辨率的数据时会遇到性能问题。

当前实现使用 cv::Mat 和 cv::transpose/cv::flip/cv::cvtColor,我对系统进行了优化以去除过渡缓冲区并尽可能多地复制。

不太乐意重新发明***,我知道使用 swscale 和 FFMpeg 的一些过滤器,可以达到相同的结果。我的问题是:

    FFMpeg 系统相当通用,您认为我可能会因使用此解决方案而受到占用空间/性能警告的困扰吗?

    OpenCV 中的格式转换似乎有些优化,但我不知道 FFMpeg 的实现...(注意:我在带有 SSE 的 x86_64 intel 平台上)

    你知道有什么库可以实时处理这种简单的转换吗?

谢谢

【问题讨论】:

2k 是巨大的。硬件设置是否有足够的提升空间? (I/O 带宽等) OpenCV 可以使用 FFMpeg 作为其背景:docs.opencv.org/3.4/d0/da7/videoio_overview.html 实时是什么意思?你想达到多少fps?正如@9dan 所发现的那样——可能存在硬件限制。 @9dan 你有什么建议? 【参考方案1】:

OpenCV 实现已针对您的配置进行了优化。不要期待 ffmpeg 的改进。最近,OpenCV 切换到 libjpeg-turbo 具有 SSE 优化,这可能会改善 JPEG 转换。

【讨论】:

它是 libjpeg-turbo,但目前不包含 SIMD(请参阅 here)。随时提交拉取请求以添加 SIMD 支持。 @Catree 感谢您的澄清。我知道这涉及到官方版本,本地构建可以轻松启用 SIMD,不是吗? libjpeg-turbo 作为第三方包含在 OpenCV 中,没有 SIMD 代码。是的,您应该能够安装libjpeg-turbo(例如,从包管理器)并且OpenCV 应该能够自动检测并链接到主机libjpeg-turbo 嗨亚历克斯,你有一些资源/数字/链接可以给这个评估吗?是你的亲身经历吗?谢谢 不,我手头没有严格的测量值。我在类似转换中使用 ffmpeg 的经验相当令人失望。如果您发现确认或矛盾的证据,请在此处发布。

以上是关于用于格式转换/简单转换的 FFMpeg 与 OpenCV的主要内容,如果未能解决你的问题,请参考以下文章

最简单的基于FFMPEG的封装格式转换器(致敬雷霄骅)

最简单的基于FFMPEG的封装格式转换器(C++Qt 版)

最简单的基于FFMPEG的封装格式转换器(C++Qt 版)

用JAVA调用ffmpeg实现将各种视频格式转为flv时,怎样做出简单操作的界面?

用于将 HTML5 视频转换为 mp4 和 ogg 的 ffmpeg 设置 [关闭]

FFmpeg 中用于最快转换为 h264 的线程计数选项?