Ubuntu:VideoCapture 打开本地avi/mp4视频失败

最近在做yolov5视频检测,想着先测试一下本地的视频文件,结果就遇到报错:

failed to open video ../vtest.avi
[ERROR:0] VIDEOIO(cvCreateFileCapture_Images(filename.c_str())): raised OpenCV exception:

OpenCV(3.4.12) /home/xxx/Downloads/opencv-3.4.12/modules/videoio/src/cap_images.cpp:246: error: (-5:Bad argument) CAP_IMAGES: can't find starting number (in the name of file): ../vtest.avi in function 'icvExtractPattern'

直接放结论】:问题出在编译opencv的时候,虽然勾选了ffmpeg,但是可能是我的ubuntu系统本身没有安装ffmpeg或者是ffmpeg的版本太低,导致编译出来的opencv库,在对本地视频解码时失败,所以也就无法播放视频。解决办法就是先安装ffmpeg,然后重新编译OpenCV即可。

下面是完整的思考过程,不需要可以略过…
本来想着不是什么大问题,可能是路径不对。为了一步到位,我干脆直接使用视频的绝对路径:

/home/xx/videos/vtest.avi

结果居然还报错。显然事情没有这么简单:

Ubuntu:VideoCapture 打开本地avi/mp4视频失败_第1张图片
于是我尝试在网络搜索(baidu/google/stackoverflow/github)
一顿猛如虎的操作之后,问题依然没有找到解决办法。

于是,我仔细复盘了现在的情况:

  1. 操作系统是ubtunu,之前在win10从来没有遇到过类似情况
  2. OpenCV是我自己编译的,且经过测试,其他的库和api使用正常
  3. VideoCapture打开本地USB Camera没问题

这样看来,排除了opencv调用的时候,头文件或者库文件路径错误的原因。且VideoCapture打开摄像头是没有问题,说明该api应该也是没有问题的。但是为什么会偏偏在打开本地视频的时候报错呢?

这时候,我突然想起来:视频的播放其实是需要先解码的,只有解码之后,才能进行播放。我这里的问题很可能是由于解码失败。

联系到OpenCV的解码用的是ffmpeg,所以我想到在ubuntu系统中,安装ffmpeg:

sudo apt update
sudo apt install ffmpeg

【信心满满,再次尝试】

failed to open video ../vtest.avi
[ERROR:0] VIDEOIO(cvCreateFileCapture_Images(filename.c_str())): raised OpenCV exception:

OpenCV(3.4.12) /home/xxx/Downloads/opencv-3.4.12/modules/videoio/src/cap_images.cpp:246: error: (-5:Bad argument) CAP_IMAGES: can't find starting number (in the name of file): ../vtest.avi in function 'icvExtractPattern'

问题还在…

Ubuntu:VideoCapture 打开本地avi/mp4视频失败_第2张图片
【再次思考】:OpenCV编译的时候,会将所需要的3rd库,比如ffmpeg打包到自己的库中,比如libopencv_world.so.3.4,这样在编译成功之后,就不再依赖3rd库了。虽然此时我在ubuntu系统层面安装了ffmpeg,于事无补。代码运行的时候,其实还是调用的老版本的OpenCV,依然是不支持很多的视频编码方式的。

于是,我一狠心,再次编译OpenCV:

Ubuntu:VideoCapture 打开本地avi/mp4视频失败_第3张图片

经过一段时间的耐心等待,终于编译成功。然后赶紧测试一下,是不是问题已经解决:

/home/pl/projects/yolov5-trt-deepsort-camera/cmake-build-debug/TrackCounter -v vtest.avi
vtest.avi
fps[0], 
Preprocess Time: 8ms
Detect Time: 7ms

显然问题顺利解决。

总结:回过头看,好像问题并不难,但是当时遇到的时候,也是费了一番心思思考的。
遇到问题->尝试解决->失败->尝试解决->成功

这个过程虽然让人很苦恼,但是解决问题的那一刻,心情还是很美好的,能力也在一步步提升。

你可能感兴趣的:(opencv,ubuntu,ffmpeg,pytorch)