无法使用 opencv 打开视频



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

这是一个

编解码器问题

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

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

(然后我使用 ffmpeg 将该mp4文件转换为另一个mp4文件,认为也许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 (在 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之前,您需要使用版本 ≥ 3.98.3 sudo apt-get install libmp3lame-dev(

  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. 尝试在cmake opencv 时添加WITH_UNICAP=ON WITH_V4L=ON。但根本不起作用。
  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"视频文件从堆栈溢出

  • OpenCV 2.4 VideoCapture 在 Windows 上不起作用从堆栈溢出

> 对于 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 unzip

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">

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

MKDIR 构建

光盘构建

cmake -DBUILD_TIFF=开 -DBUILD_opencv_java=关 -DWITH_CUDA=关 -DWITH_FFMPEG=关 -DENABLE_AVX=开 -DWITH_OPENGL=开 -DWITH_OPENCL=开 -DWITH_IPP=开 -DWITH_TBB=开 -DWITH_EIGEN=开 -DWITH_V4L=开 -DBUILD_TESTS=关 -

DBUILD_PERF_TESTS=关 -DCMAKE_BUILD_TYPE=释放 -DCMAKE_INSTALL_PREFIX=$(PYTHON3 -C "导入系统;print(sys.prefix("( -DPYTHON3_EXECUTABLE=$(其中 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;打印(get_python_lib((("( ..

须藤制作安装

相关内容

  • 没有找到相关文章

最新更新