【问题标题】:Error opening video file with openCV cv2VideoCapture使用 openCV cv2VideoCapture 打开视频文件时出错
【发布时间】:2017-02-05 08:55:01
【问题描述】:

我在这里有一个视频文件 /data/out.mp4 及其副本 /data/out。 我在使用 Xcode 8 的 Osx Sierra 上。

使用 mp4 扩展名打开视频是可以的,但没有扩展名或任何其他格式时会出错。

我从 git 尝试了 opencv 2.4 和最新的 3.2。 用ffmpeg release/2.0编译,也试过release/3.0

使用 opencv 3.2 版:

Python 2.7.10 (default, Jul 30 2016, 19:40:32)
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.34)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> cv2.__version__
'3.2.0-dev'
>>> cv2.__file__
'/Users/johndoe/work/myproject/venv/local/lib/python2.7/site-packages/cv2.so'

如果视频有扩展名:

>>> v=cv2.VideoCapture('/data/out.mp4')
>>> v.get(cv2.CAP_PROP_FRAME_COUNT)
61117.0

如果视频没有扩展名:

>>> v=cv2.VideoCapture('/data/out')
VIDEOIO(cvCreateFileCapture_AVFoundation (filename)): raised unknown C++ exception!

>>> v.get(cv2.CAP_PROP_FRAME_COUNT)
0.0

我的 FFmpeg 配置:

./configure --prefix=/usr \
--bindir=/usr/local/bin/ \
--shlibdir=/usr/lib64 \
--datadir=/usr/share/ffmpeg \
--incdir=/usr/include/ffmpeg \
--libdir=/usr/lib64 \
--mandir=/usr/share/man \
--extra-cflags='-O2 -g' \
--extra-version=rpmfusion \
--enable-bzlib  \
--enable-nonfree \
--enable-libopenjpeg \
--enable-libx264  \
--enable-avfilter \
--enable-postproc \
--enable-pthreads \
--disable-static \
--enable-shared \
--enable-gpl \
--enable-runtime-cpudetect \
--arch=x86_64

我的 opencv CMAKE:

cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/Users/johndoe/work/myproject/venv/local/ \
-D INSTALL_C_EXAMPLES=OFF \
-D PYTHON_PACKAGES_PATH=/Users/johndoe/work/myproject/venv/lib/python2.7/site-packages \
-D INSTALL_PYTHON_EXAMPLES=ON \
-D PYTHON_EXECUTABLE=/Users/johndoe/work/myproject/venv/bin/python \
-D WITH_CUDA=OFF ..

我尝试了各种其他格式重新编码我的原始视频(即:ffmpeg -i out.mp4 out.asf):

>>> v=cv2.VideoCapture('/data/out.avi')
VIDEOIO(cvCreateFileCapture_AVFoundation (filename)): raised unknown C++ exception!

>>> v=cv2.VideoCapture('/data/out.flv')
VIDEOIO(cvCreateFileCapture_AVFoundation (filename)): raised unknown C++ exception!

>>> v=cv2.VideoCapture('/data/out.asf')
VIDEOIO(cvCreateFileCapture_AVFoundation (filename)): raised unknown C++ exception!

【问题讨论】:

  • 所以你的问题是“如何让opencv推断文件类型,如果文件没有扩展名?”

标签: python opencv video ffmpeg


【解决方案1】:

OpenCV 可能使用不同的 Capture API。可以通过将 API 指定为 VideoCapture() 的第二个参数来强制执行 API:

v = cv2.VideoCapture('/data/out', cv2.CAP_FFMPEG)

我试过 cv2.VideoCapture() 文件有扩展名和没有扩展名,它工作正常,使用默认的 Capture API。请注意,我在 OS X El Captain 上,并且使用 python 3.5.2 和 OpenCV 3.1 都安装了 conda (Anaconda)。

【讨论】:

  • 这确实消除了原始错误,但仍然无法使用 cv2.CAP_PRO_FRAME_COUNT 返回 0.0 的帧数,尽管视频为 2M 并且在 VLC 中可读。
  • 尝试从文件中获取并显示几个帧。这是为了检查,该文件实际上已加载/解析。
  • @kollo 对此有任何了解。
【解决方案2】:

我遇到了同样的错误,但最终我自己修复了它!请看下图。在我的错误中,我发现一行写着“命名 CamTwist”——CamTwist 是我几个月前安装的一个应用程序/插件,它阻塞了对我网络摄像头的主要访问。几周前我已经卸载了该应用程序,但我的硬盘驱动器上有一些剩余文件,所以我转到我的 Finder > 主页 > 搜索:CamTwist,瞧!有两个包含 CamTwist 的文件,所以我把它们扔进了垃圾桶,快速清空了那个东西,重新运行了我的代码,WALLAH!我很高兴。

我建议搜索“名称”行。也许你也安装了一些愚蠢的网络摄像头应用程序,阻塞了访问!

Click to view screenshot of my terminal code and where I found the core issue for my bug

【讨论】:

    【解决方案3】:

    我遇到了同样的问题,请输入绝对媒体文件路径。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-28
      • 2019-11-22
      • 2014-10-02
      • 2017-09-28
      • 2018-04-05
      • 2012-05-08
      • 2018-07-26
      • 2016-10-03
      相关资源
      最近更新 更多