opencv读取视频文件 opencv读取视频的过程是解码

介绍深入分析OpenCV中VideoCapture对象背后的视频编解码第三方库支持和速度奥秘。支持的第三个编***库和类型我们都知道OpenCV中的VideoCapture视频阅读就是在其他第三方库的帮助下进行编码和解码的过程。目前支持的视频解码主要包括:mkv / mpeg2mkv / h2***mkv / h265 mkv /...

介绍

深入分析OpenCV中VideoCapture对象背后的视频编解码第三方库支持和速度奥秘。

支持的第三个编***库和类型

我们都知道OpenCV中的VideoCapture视频阅读就是在其他第三方库的帮助下进行编码和解码的过程。目前支持的视频解码主要包括:

mkv / mpeg2mkv / h2***mkv / h265 mkv / vp8 mp4 / mpeg2 mp4 / h2***mp4 / h265avi / mpeg2avi / h2*** avi / vp8

视频编码主要包括:

mkv / mpeg2mkv / h2***mkv / vp8mp4 / h2*** avi / mpeg2avi / h2***avi / vp8

我们最常用的用于读取视频文件的OpenCV函数的VideoCapture参数解释如下:

cv::VideoCapture::VideoCapture( const String & filename, int apiPreference = CAP_ANY)

参数filename表示文件名,人们往往忽略了第二个参数的默认值是CAP_ANY,表示系统自动检测并选择。读取摄像头或IP视频流时:

cv::VideoCapture::VideoCapture( int index, int apiPreference = CAP_ANY)

其中index表示摄像机的ID标识。

读取视频文件时,第二个参数可以设置为:

cv::CAP_FFMPEGcv::CAP_INTEL_MFX

当读取摄像机或视频流时,第二个参数可以设置为

cv::CAP_DSHOW // windows只支持cv::CAP_MSMFcv::CAP_V4L

如何查询当前OpenCV版本支持哪些视频编解码的第三方后端库,可以通过下面的代码来完成:

std::vector<cv::VideoCaptureAPIs> vcs = cv::videoio_registry::getBackends();for (auto item : vcs) { std::cout << "name:" << cv::videoio_registry::getBackendName(item) << std::endl;}

运行结果如下:

我的版本是OpenVINO2021.02+OpenCV4.5.1的共编译版本,因此支持GSTREAMER和INTEL_MFX后端库。FFMPEG和英特尔MFX库视频解码的对比演示代码如下:

// cv::VideoCapture cap("D:/test.h2***", cv::CAP_INTEL_MFX);// cv::VideoCapture cap("D:/test.h2***", cv::CAP_FFMPEG);// cv::VideoCapture cap("D:/i***ges/video/play_football.mp4", cv::CAP_FFMPEG);cv::VideoCapture cap(0, cv::CAP_DSHOW);cv::Mat frame;cv::TickMeter tick;int fps = cap.get(cv::CAP_PROP_FPS);int h = cap.get(cv::CAP_PROP_FRAME_HEIGHT);int w = cap.get(cv::CAP_PROP_FRAME_WIDTH);std::cout << "fps:" << fps << " heigh:" << h << " width:" << w << std::endl;// cv::VideoWriter writer("D:/test.h2***", cv::VideoWriter::fourcc('H', '2', '6', '4'), fps, cv::Size(w, h), true);while (true){ tick.start(); bool ret = cap.read(frame); tick.stop(); if (!ret) { break; } double res_fps = tick.getCounter() / tick.getTimeSec(); std::cout << tick.getCounter() << " frames in " << tick.getTimeSec() << " sec ~ " << res_fps << " FPS" << " (total time: " << tick.getTimeSec() << " sec)" << std::endl; cv::imshow("input", frame); char c = cv::waitKey(1); // writer.write(frame); if (c == 27) { break; }}// writer.release();cap.release();return 0;

加速解码

默认OpenCV下载只支持CAP_DSHOW在Widnows下解码读取实时视频流。我测试过,这种方式的实时性能不如直接读取视频文件的效率高。单纯读取我电脑自带摄像头(第八代酷睿i7 CPU)的速度只有35FPS左右,而我读取视频文件通过FFMPEG支持可以轻松达到每秒220FPS左右。而且OpenCV中的FFMPEG是一个不支持硬件加速的版本,所以响应更好的响应视频流水线操作绝对不能这样读。有什么好办法吗?结合OpenCV,有一条可以提高视频流解码速度,提高流水线运行效率的技术路线。

方法:使用GSTREAMER支持模式

与FFMPEG第三方库相比,GSTREAMER支持多种后端,通过软硬件加速解码视频,还支持异步操作。经过这波操作,解码速度将比原来的OpenCV自动检测方法快N倍以上。官方实验给出的数据如下:

实事证明的确可以加速很多!该方法只在ubuntu系统下验证过,widnows系统下还没有验证过,官方说 in theory, can run~~~~作为技术人员看到这句话你懂的,就是坑很多,你自己看着办!事实证明,真的可以加快很多!这种方法只在ubuntu系统下验证过,没有在widnows系统下验证过。官方说理论上可以跑~~~~ ~作为技术人员,你知道这句话,就是坑多。自己看着办吧

另外就是彻底抛弃Windows的DSHOW,有钱买加速卡,直接硬件解码加速,这样就没有后顾之忧了。

为了让大家更好的理解和使用OpenVINO框架,我特意整理了OpenVINO计算机视觉加速的学习路径,如下图:

本文来自眼泪是回忆的常客投稿,不代表舒华文档立场,如若转载,请注明出处:https://www.chinashuhua.cn/24/650744.html

打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
() 0
上一篇 07-26
下一篇 07-26

相关推荐

  • 如何制作视频(如何制作视频剪辑)

    编辑导语:在短视频不断发展的时代,越来越多的个人和企业投身于短视频行业。本文作者介绍进入短视频后制作视频的正确步骤。让我们一起学习。我还是要坚持年初定下的短视频旗帜。虽然三天打鱼两天晒网,但我从未放弃。今天就来总结一下,视频制作的正确步骤,一定会为新生节省

    2023-07-29 06:46:01
    1033 0
  • 抖音怎么拍长视频(抖音怎么制作长视频)

    熟悉抖音视频的朋友应该会发现,在Tik Tok上传视频的默认时间只有15秒,但是在刷Tik Tok的时候会看到一些30秒甚至60秒的视频。这是怎么做到的?Tik Tok如何上传或拍摄30秒甚至1分钟的长视频?其实这是有原因的!目前Tik Tok官方只对部分用户开放了Tik Tok长视频的功能,Tik T

    2023-07-28 21:14:01
    589 0
  • 4K视频线 4K高清HDMI视频线

    在选购视听设备的过程中,很多人往往把重点放在电视功放等设备的选择上,而忽略了HDMI高清线的作用。其实不起眼的HDMI高清线还是比较关键的。设计的好坏决定了最终的画质显示效果,所以要选择合适的HDMI视频线。已经成为用户不可忽视的问题。但是面对市面上各种款式和做工的产

    2023-07-28 20:22:01
    911 0
  • 怎么剪切视频中的一部分 手把手教你剪切视频

    上次小峰给大家分享了如何合成视频,也就是如何把多个视频文件组合起来,做成一个视频汇编。不久后,小峰收到了很多网友的私信,说是想让小峰介绍一下视频的方法。既然视频可以合成在一起,自然,视频也可以分割。今天小峰刚拿到空,就给大家一个详细的视频拍摄教程吧。顺便给

    2023-07-27 22:36:01
    145 0

评论列表

联系我们

在线咨询: QQ交谈

邮件:admin@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信