无法使用opencv打开视频

Ann*_*wan 14 python video opencv 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()
Run Code Online (Sandbox Code Playgroud)

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

[h264 @ 0x1053ba0] AVC: nal size 554779904
[h264 @ 0x1053ba0] AVC: nal size 554779904
[h264 @ 0x1053ba0] no frame!
Run Code Online (Sandbox Code Playgroud)

vlcmplayer可播放该视频,但OpenCV的不能.

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

我的ubuntu版本是14.04 trusty.

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

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

Ann*_*wan 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链接: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支持(--enable-pic在FFmpeg配置期间).

    如果您的目标平台需要与位置无关的二进制文件,则应将正确的链接标志(例如-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)

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

(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

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

方法我尝试但没有奏效

  1. 尝试WITH_UNICAP=ON WITH_V4L=ONcmakeopencv 时添加.但根本没用.
  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

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

相关问题

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

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

  • 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