无法使用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!
我的vlc
和mplayer
可以播放这个视频,但是opencv 不能。
我已经安装了x264
和libx264-142
编解码器包。 (使用sudo apt-get install
)
我的ubuntu版本是14.04 trusty
。
我不确定是不是编解码器问题?
我已经用WITH_UNICAP=ON
或WITH_UNICAP=OFF
重建了opencv,但它根本不影响问题。错误消息永远不会改变。
【问题讨论】:
你试过用ffmpeg打开它吗(opencv "wraps" ffmpeg...)? 你使用的是什么版本的 OpenCV? 另外,您是否在构建后运行了测试? 您是否尝试跳过无法读取的帧并尝试下一帧? @xiawi 你这是什么意思?该怎么做? 【参考方案1】:这是一个编解码器问题
我将 mp4
文件转换为带有 ffmpeg
的 avi
文件。那么上面的opencv代码就可以很好的播放那个avi
文件了。
因此我确定这是一个编解码器问题。
(然后我使用ffmpeg
将mp4
文件转换为另一个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
【讨论】:
我按照您的确切指示重建了ffmpeg
和opencv
,一切似乎都很顺利。但是,我的opencv
仍然无法阅读mp4
或avi
视频。 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 打开视频