当前位置: 首页 > 面试题库 >

无法使用OpenCV打开视频

萧奇
2023-03-14
问题内容

在执行其他操作时,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=ON或重建了opencv WITH_UNICAP=OFF,但它根本不影响问题。错误消息永远不会改变。


问题答案:

我将该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

  1. tar -xvf ffmpeg-2.7.1.tar.bz2
  2. cd ffmpeg-2.7.1
  3. ./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之前)

  1. make -j5 (在ffmpeg文件夹下)
  2. 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

  1. make -j5
  2. sudo make install
  3. sudo sh -c 'echo "/usr/local/lib" > /etc/ld.so.conf.d/opencv.conf'
  4. 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'))但根本不起作用。

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

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

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

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

相关问题

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



 类似资料:
  • 问题内容: 所以现在有适用于Java的 OpenCV …!谁能告诉我如何用它打开Videofiles? 我尝试浏览整个Internet,但一无所获。VideoCapture类的文档不是很有帮助,因为它给出了一个C#示例并显示了如何从网络摄像头捕获。 OpenCV的Q&A也无济于事,因为没有(公开)方法可以向您提供文件名字符串。 但它 应该 按照API的 规定 工作。但是它没有,但是VideoCap

  • 问题内容: 使用Python 2.5.2和Linux Debian,我试图从包含西班牙字符的西班牙URL中获取内容: 我收到此错误: UnicodeEncodeError:’ascii’编解码器无法在位置8编码字符u’\ xe1’:序数不在范围内(128) 我已经尝试过在将URL传递给urllib之前使用: 和这个: 但是他们没有用。 你能告诉我我做错了什么吗? 问题答案: 根据适用的标准RFC

  • 我正在使用Android Studio。我需要在SQLite中存储数据,但我无法打开Android设备监视器。 错误消息: 检查1473682358409.log。 1473682358409.日志: 消息应用程序错误!STACK 1 Java . io . file not found exception:C:\ Users \ username . Android \ monitor-work

  • !Entry org.eclipse.osgi 4 0 201 5-01-05 04:00:15.930!Message Bundle Reference:File:org.apache.ant_1.8.3.v201301120609/@4找不到。 !Entry org.eclipse.osgi 4 0 201 5-01-05 04:00:15.934!Message Bundle Referen

  • 我把Visual Studio从社区2015升级到了社区2017。现在,当我编译时,我得到错误消息,说“Error (active) E1696无法打开源文件“stdio.h”,引用的行如下所示: 如果我创建一个新项目,则会找到 stdio.h。 因此,我查看了项目配置属性- 所以似乎需要设置VC_IncludePath,但我找不到任何设置的地方。请注意,我找不到宏的,这可能是因为我使用的是 Vi

  • 问题内容: 我正在尝试一个简单的事情 并得到这个错误 我不明白,因为安装了cv2。 是 我的系统是Ubuntu 12.04。 也许有人遇到了同样的问题,可以帮助我。 编辑: 长话短说, testypypypypy.py : 错误: 如果我接受它是因为存在,但是如果我也接受,则会遇到相同的错误…因此它丢失了,我必须添加它,但我不知道如何。 问题答案: 我认为这远非“正确”的方法(Ubuntu上的“正