无法使用opencv打开视频

Posted

技术标签:

【中文标题】无法使用opencv打开视频【英文标题】:Can't open video using opencv 【发布时间】:2015-09-11 11:50:12 【问题描述】:

opencv 在做其他事情时工作正常。它可以打开图像并显示图像。但它无法打开视频。

我用来打开视频的代码如下

import cv2

cap = cv2.VideoCapture("MOV_0006.mp4")

while True:
    ret, frame = cap.read()

    cv2.imshow('video', frame)
    if cv2.waitKey(1) & 0xff == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

但是在执行时,它会输出如下错误消息

[h264 @ 0x1053ba0] AVC: nal size 554779904
[h264 @ 0x1053ba0] AVC: nal size 554779904
[h264 @ 0x1053ba0] no frame!

我的vlcmplayer 可以播放这个视频,但是opencv 不能。

我已经安装了x264libx264-142 编解码器包。 (使用sudo apt-get install

我的ubuntu版本是14.04 trusty

我不确定是不是编解码器问题?

我已经用WITH_UNICAP=ONWITH_UNICAP=OFF 重建了opencv,但它根本不影响问题。错误消息永远不会改变。

【问题讨论】:

你试过用ffmpeg打开它吗(opencv "wraps" ffmpeg...)? 你使用的是什么版本的 OpenCV? 另外,您是否在构建后运行了测试? 您是否尝试跳过无法读取的帧并尝试下一帧? @xiawi 你这是什么意思?该怎么做? 【参考方案1】:

这是一个编解码器问题

我将 mp4 文件转换为带有 ffmpegavi 文件。那么上面的opencv代码就可以很好的播放那个avi文件了。

因此我确定这是一个编解码器问题。

(然后我使用ffmpegmp4 文件转换为另一个mp4 文件,认为ffmpeg 可能有助于将原来不可读的.mp4 编解码器转换为可读的.mp4 编解码器,但生成的@ 987654342@ 文件最终损坏。这一事实可能与此问题有关,也可能与此问题无关,只是提一下,以防有人需要此信息。)

答案 - 重建 FFmpeg 然后重建 Opencv

尽管知道这是一个编解码器问题,但我尝试了许多其他方法,但仍然无法解决。最后我尝试重建ffmpeg和opencv,然后问题就解决了!

以下是我详细的重建过程。

(1) 构建ffmpeg

    下载ffmpeg-2.7.1.tar.bz2

    FFmpeg 网站:https://www.ffmpeg.org/download.html

    ffmpeg-2.7.1.tar.bz2 链接:http://ffmpeg.org/releases/ffmpeg-2.7.1.tar.bz2

    tar -xvf ffmpeg-2.7.1.tar.bz2 cd ffmpeg-2.7.1 ./configure --enable-pic --extra-ldexeflags=-pie

    来自http://www.ffmpeg.org/platform.html#Advanced-linking-configuration

    如果您静态编译了 FFmpeg 库并希望使用它们来构建您自己的共享库,您可能需要强制 PIC 支持(在 FFmpeg 配置期间使用--enable-pic)。

    如果您的目标平台需要与位置无关的二进制文件,您应该将正确的链接标志(例如-pie)传递给--extra-ldexeflags


    如果遇到错误: yasm/nasm not found or too old. Use --disable-yasm for a crippled build.

    只要sudo apt-get install yasm


    其他构建选项:https://trac.ffmpeg.org/wiki/CompilationGuide/Ubuntu

    例如添加选项--enable-libmp3lame 启用png 编码器。 (./configure之前需要sudo apt-get install libmp3lame-dev,版本≥3.98.3)

    make -j5(在ffmpeg文件夹下) sudo make install

(2) 构建Opencv

    wget http://downloads.sourceforge.net/project/opencvlibrary/opencv-unix/2.4.9/opencv-2.4.9.zip unzip opencv-2.4.9.zip cd opencv-2.4.9 mkdir build cd build cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D BUILD_NEW_PYTHON_SUPPORT=ON -D WITH_QT=OFF -D WITH_V4L=ON -D CMAKE_SHARED_LINKER_FLAGS=-Wl,-Bsymbolic ..

    您可以根据需要更改这些选项。只有最后一个-D CMAKE_SHARED_LINKER_FLAGS=-Wl,-Bsymbolic 是关键选项。如果省略这一项,make 会跳出错误。

    这也是来自http://www.ffmpeg.org/platform.html#Advanced-linking-configuration(上面第4步的同一个链接)

    如果您静态编译了 FFmpeg 库并希望使用它们来构建您自己的共享库,您可能需要...并将以下选项添加到您的项目LDFLAGS-Wl,-Bsymbolic

    make -j5 sudo make install sudo sh -c 'echo "/usr/local/lib" > /etc/ld.so.conf.d/opencv.conf' sudo ldconfig

现在opencv代码应该可以很好地播放mp4文件了!

我尝试过但没有用的方法

    尝试在cmake opencv 时添加WITH_UNICAP=ON WITH_V4L=ON。但根本没有用。 尝试更改 python opencv 代码中的编解码器。但徒劳无功。

    cap = cv2.VideoCapture("MOV_0006.mp4")

    print cap.get(cv2.cv.CV_CAP_PROP_FOURCC)

    我在两个环境中对此进行了测试。在第一个环境中,opencv 可以工作,而在另一个环境中,opencv 无法播放视频。但是两者都打印出相同的编解码器828601953.0

    我尝试通过cap.set(cv2.cv.CV_CAP_PROP_FOURCC, cv2.cv.CV_FOURCC(*'H264')) 更改他们的编解码器,但根本没有用。

    尝试将opencv-2.4.8/3rdparty/lib/ 下的库更改为我工作环境中的库。但甚至无法成功构建。

    我 grep AVC: nal size 并发现包含此错误消息的库是 opencv-2.4.8/3rdparty/lib/libavcodec.a 等。这就是我尝试替换它们的原因。但事实证明这是个坏主意。

    sudo apt-get -y install libopencv-dev build-essential cmake git libgtk2.0-dev pkg-config python-dev python-numpy libdc1394-22 libdc1394-22-dev libjpeg-dev libpng12-dev libtiff4-dev libjasper-dev libavcodec-dev libavformat-dev libswscale-dev libxine-dev libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev libv4l-dev libtbb-dev libqt4-dev libfaac-dev libmp3lame-dev libopencore-amrnb-dev libopencore-amrwb-dev libtheora-dev libvorbis-dev libxvidcore-dev x264 v4l-utils unzip

    尝试安装一些那个东西和一些这个东西。但这完全没用。

相关问题

我在网上搜索了很多类似的问题,但没有一个有解决方案!

以下是我认为与我相同的问题。

OpenCV/ffmpeg 无法播放我的 mp4 视频。来自opencv-users.nabble.com

VideoCapture 在 OpenCV 2.4.2 中不起作用来自answers.opencv.org

这个提到重建ffmpeg!但这些论据对我来说还不够。

Mp4 读取问题 - 我安装了 OpenCV 2.4.1 和 python 2.7 并制作了一个成功读取 avi 文件的小程序。但是它无法读取 mp4 文件来自answers.opencv.org

无法在 _Windows 7 机器中使用 OpenCV 2.4.3、Python 2.7 打开“.mp4”视频文件来自Stack Overflow

OpenCV 2.4 VideoCapture 无法在 Windows 上运行来自Stack Overflow

【讨论】:

我按照您的确切指示重建了ffmpegopencv,一切似乎都很顺利。但是,我的opencv 仍然无法阅读mp4avi 视频。 import cv2; cv2.VideoCapture('example.mp4').isOpened() 总是返回 False。我的操作系统也是 Ubuntu 14.04。非常感谢您的帮助! 你确定这个问题和你的一样吗?在这个问题中,.avi 可以打开,而.mp4 则不能。 您是如何安装或配置 OpenCV 的?我运行了 OpenCV 2.4.10 installation script,没有做任何其他事情。 最初使用与您相同的脚本进行安装,但随后出现编解码器问题。然后我使用上面的配置步骤重新安装。【参考方案2】:

对于 ubuntu 14.04,这就是我修复它的方法。

安装 OpenCV 所需的依赖项

sudo apt-get remove ffmpeg x264 libx264-dev

sudo apt-get 更新

sudo apt-get install libgstreamer0.10-0 libgstreamer0.10-dev gstreamer0.10-tools gstreamer0.10-plugins-base libgstreamer-plugins-base0.10-dev gstreamer0.10-plugins-good gstreamer0.10- plugins-ugly gstreamer0.10-plugins-bad gstreamer0.10-ffmpeg

sudo apt-get -y install libopencv-dev build-essential cmake git libgtk2.0-dev pkg-config python-dev python-numpy libdc1394-22 libdc1394-22-dev libjpeg-dev libpng12-dev libtiff4-dev libjasper -dev libavcodec-dev libavformat-dev libswscale-dev libxine-dev libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev libv4l-dev libtbb-dev libqt4-dev libfaac-dev libmp3lame-dev libopencore-amrnb-dev libopencore- amrwb-dev libtheora-dev libvorbis-dev libxvidcore-dev x264 v4l-utils 解压

sudo add-apt-repository ppa:mc3man/gstffmpeg-keep

sudo apt-get 更新

sudo apt-get install gstreamer0.10-ffmpeg

sudo apt-get install gstreamer0.10-plugins-bad

sudo apt-get 更新

在 anaconda3 中安装 ffmpeg"

conda install -c menpo ffmpeg=2.7.0

下载 Opencv 3.1.0"

wgethttps://github.com/Itseez/opencv/archive/3.1.0.zip 解压 3.1.0.zip

mkdir 构建

cd 构建

cmake -DBUILD_TIFF=ON -DBUILD_opencv_java=OFF -DWITH_CUDA=OFF -DWITH_FFMPEG=OFF -DENABLE_AVX=ON -DWITH_OPENGL=ON -DWITH_OPENCL=ON -DWITH_IPP=ON -DWITH_TBB=ON -DWITH_EIGEN=ON -DWITH_V4L=ON -DBUILD_TESTS =OFF -DBUILD_PERF_TESTS=OFF -DCMAKE_BUILD_TYPE=RELEASE -DCMAKE_INSTALL_PREFIX=$(python3 -c "import sys; print(sys.prefix)") -DPYTHON3_EXECUTABLE=$(which python3.5) -DPYTHON3_INCLUDE_DIR=$(python3 -c" from distutils.sysconfig import get_python_inc; print(get_python_inc())") -DPYTHON3_PACKAGES_PATH=$(python3 -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())") ..

制作

sudo 安装

【讨论】:

亲爱的主,这是很多东西。那么之后它可以与 mp4 文件一起使用吗? 是的,我也在 Ubuntu 16.10 上进行了测试。它就像一个魅力。这部分可以忽略在anaconda3里面安装ffmpeg" conda install -c menpo ffmpeg=2.7.0 嗨。我在 ubuntu 16.04 上按照您的步骤进行操作,但是找不到很多软件包,没有安装候选: E:软件包“gstreamer0.10-plugins-ugly”没有安装候选 E:软件包“gstreamer0.10-plugins-bad”没有安装候选 E: 无法找到包 gstreamer0.10-ffmpeg E: 找不到 glob 'gstreamer0.10-ffmpeg' 的任何包 E: 找不到任何包 regex 'gstreamer0.10-ffmpeg'

以上是关于无法使用opencv打开视频的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 opencv 3.1 和 python 3.6 打开视频

无法使用videoCapture opencv打开视频

无法在 OpenCV python 中打开视频文件

无法在 Windows 7 机器中使用 OpenCV 2.4.3、Python 2.7 打开“.mp4”视频文件

OPENCV,无法打开类 VideoWriter

Python opencv 无法从视频中裁剪帧