无法使用opencv打开视频

时间:2015-06-25 03:31:33

标签: python opencv video codec

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,但它根本不会影响问题。错误消息永远不会改变。

2 个答案:

答案 0 :(得分:25)

这是编解码器问题

我将mp4文件转换为avi文件ffmpeg。然后上面的opencv代码可以很好地播放avi文件。

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

(然后我使用mp4将该mp4文件转换为另一个ffmpeg文件,认为ffmpeg可能有助于将原始不可读的.mp4编解码器转换为可读.mp4编解码器,但生成的.mp4文件最终被破坏。这个事实可能与此问题有关,也可能没有,只需提及,以防任何人需要此信息。)

答案 - 重建FFmpeg然后重建Opencv

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

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

(1)构建ffmpeg

  1. 下载ffmpeg-2.7.1.tar.bz2
      

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

         

    ffmpeg-2.7.1.tar.bz2 link:http://ffmpeg.org/releases/ffmpeg-2.7.1.tar.bz2

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

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

         

    如果您静态编译FFmpeg库并且想要使用它们来构建自己的共享库,则可能需要强制PIC支持(在FFmpeg configure期间使用--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

         

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

  5. make -j5(在ffmpeg文件夹下)
  6. sudo make install
  7. (2)构建Opencv

    1. wget http://downloads.sourceforge.net/project/opencvlibrary/opencv-unix/2.4.9/opencv-2.4.9.zip
    2. unzip opencv-2.4.9.zip
    3. cd opencv-2.4.9
    4. mkdir build
    5. cd build
    6. 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

    7. make -j5
    8. sudo make install
    9. sudo sh -c 'echo "/usr/local/lib" > /etc/ld.so.conf.d/opencv.conf'
    10. sudo ldconfig
    11. 现在opencv代码应该很好地播放mp4文件!

      我试过的但没有用的方法

      1. WITH_UNICAP=ON opencv时尝试添加WITH_V4L=ON cmake。但根本没用。
      2. 尝试更改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'))更改其编解码器,但根本不起作用。

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

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

      4. 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
          

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

      5. 相关问题

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

        以下是我认为和我一样的问题。

        • 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

答案 1 :(得分:1)

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

安装OpenCV"

所需的依赖项

sudo apt-get remove ffmpeg x264 libx264-dev

sudo apt-get update

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 unzip

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

sudo apt-get update

sudo apt-get install gstreamer0.10-ffmpeg

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

sudo apt-get update

在anaconda3"

中安装ffmpeg

conda install -c menpo ffmpeg = 2.7.0

下载Opencv 3.1.0"

wget https://github.com/Itseez/opencv/archive/3.1.0.zip 解压缩3.1.0.zip

mkdir build

cd build

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 = $(python3.5)-DPYTHON3_INCLUDE_DIR = $ (python3 -c"来自distutils.sysconfig import get_python_inc; print(get_python_inc())")-DPYTHON3_PACKAGES_PATH = $(python3 -c"来自distutils.sysconfig import get_python_lib; print(get_python_lib() )")..

sudo make install