Python 使用openCV cv2VideoCapture打开视频文件时出错

Python 使用openCV cv2VideoCapture打开视频文件时出错,python,opencv,video,ffmpeg,Python,Opencv,Video,Ffmpeg,我这里有一个视频文件/data/out.mp4及其副本/data/out。 我在Osx Sierra上使用Xcode 8 使用mp4扩展名打开视频正常,但在没有扩展名或任何其他格式的情况下出现错误 我试用了git的opencv 2.4和最新的3.2。 使用ffmpeg release/2.0和tryed release/3.0编译 使用opencv 3.2版: Python 2.7.10 (default, Jul 30 2016, 19:40:32) [GCC 4.2.1 Compatible

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

使用mp4扩展名打开视频正常,但在没有扩展名或任何其他格式的情况下出现错误

我试用了git的opencv 2.4和最新的3.2。 使用ffmpeg release/2.0和tryed 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
如果视频有分机:

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
如果视频没有分机:

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):


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


我尝试了cv2.VideoCapture(),文件有扩展名和没有扩展名,使用默认的捕获API,效果很好。请注意,我使用的是OS X El Captain,使用的是python 3.5.2和OpenCV 3.1,所有这些都是与conda(Anaconda)一起安装的

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

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

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


因此,您的问题是“如果文件没有扩展名,如何使opencv推断文件类型?”这确实消除了原始错误,但仍然无法使用cv2获取帧计数。尽管视频在VLC中为2M且可读,但CAP_PRO_frame_count返回0.0。尝试从文件中获取并显示两帧。这是为了检查,该文件实际上已加载/解析。@kollo对此是否有任何发现。