在执行其他操作时,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
或重建了opencv WITH_UNICAP=OFF
,但它根本不影响问题。错误消息永远不会改变。
我将该mp4
文件转换为的avi
文件ffmpeg
。然后上面的opencv代码可以avi
很好地播放该文件。
因此,我确定这是一个编解码器问题。
(然后,我使用将该mp4
文件转换为另一个mp4
文件ffmpeg
,以为可能ffmpeg
有助于将原始的不可读.mp4
编解码器转换为可读.mp4
编解码器,但是最终.mp4
文件最终被破坏了。这个事实可能与该问题无关,只是提到,以防万一。需要此信息。)
尽管知道这是一个编解码器问题,但我尝试了许多其他方法,但仍然无法解决。最后我尝试重建ffmpeg和opencv,然后问题解决了!
以下是我的详细重建过程。
(1)建立ffmpeg
FFmpeg网站:https :
//www.ffmpeg.org/download.htmlffmpeg-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支持(
--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之前)
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
很好地播放文件了!
WITH_UNICAP=ON
WITH_V4L=ON
在cmake
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
尝试安装一些东西和一些东西。但这是完全没有用的。
我已经在网上搜索了很多类似的问题,但是没有一个有解决方案!
问题内容: 所以现在有适用于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上的“正