opencv 无法停止流:设备的 ioctl 不合适

Posted

技术标签:

【中文标题】opencv 无法停止流:设备的 ioctl 不合适【英文标题】:opencv Unable to stop the stream: Inappropriate ioctl for device 【发布时间】:2017-05-03 04:23:53 【问题描述】:

我只想将视频转换为帧图像。

使用这个简单的代码

import cv2
vidcap = cv2.VideoCapture('gog.mp4')
success,image = vidcap.read()
count = 0
success = True
while success:
  success,image = vidcap.read()
  print 'Read a new frame: ', success
  cv2.imwrite("frame%d.jpg" % count, image)
  count += 1

输出是

无法停止流:设备的 ioctl 不合适

我在 ubuntu 服务器上使用 python 2.7.6。

【问题讨论】:

有这方面的消息吗? 还没有。我认为这可能是 ffmpeg 问题 类似问题:***.com/q/42562876/5989200 【参考方案1】:

您好,我也遇到了这个错误并用这个命令解决了。

sudo apt-get install libv4l-dev
cmake -DWITH_LIBV4L=ON .. (this is important)
make && sudo make install

如果第二个 cmake 命令出错,请安装 cmake gui。执行第一个命令:sudo apt-get install libv4l-dev 通过 cmakegui 程序,您可以使用 CmakeVars.txt 文件设置参数。编辑 CmakeVars.txt 文件交换 WITH_LIBV4L=OFF 到 WITH_LIBV4L=ON 并运行make && sudo make install 命令。有关此错误的更多信息,请访问:https://github.com/opencv/opencv/issues/6157

【讨论】:

cmake 应该从哪个目录运行? @emre,您在github.com/opencv/opencv/issues/6157 中提到的错误是关于“VIDIOC_QUERYCTRL:设备的 ioctl 不合适”。它不同于“无法停止流:设备的 ioctl 不合适”。你确定它们是相关的吗?【参考方案2】:

我在使用 Java 的 Manjaro 17.0.2 和 OpenCV 3.2.0 时遇到了完全相同的问题。我删除了 OpenCV 的旧实现,然后从头开始重新安装它。使用这些参数运行 cmake cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local -D WITH_LIBV4L=ON ..(感谢 @emre)

然后在 Cmake 安装的输出中我注意到Can't find ffmpeg - 'pkg-config' utility is missing。安装 pkg-config 并重新运行 cmake、make,现在一切正常。

【讨论】:

【参考方案3】:

问题是由于缺少 ffmpeg 和 ffmpeg-devel。 您可以在 cmake 输出中验证这一点。

如果 FFMPEG 不可用,那些 YES 将变为 NO。如果您在没有 FFMPEG 的情况下编译和安装 opencv,对于视频相关示例,您将收到错误“无法停止流:设备的 ioctl 不合适”。

要解决您的问题,请安装 ffmpeg 和 ffmpeg-devel,然后再次“make”和“make install”。

希望这会有所帮助。

【讨论】:

【参考方案4】:

我已经在 Ubuntu 16.04.3 上解决了这个问题。

    sudo apt-get install ffmpeg sudo apt-get install libavcodec-dev libavformat-dev libavdevice-dev

    使用以下命令重建 OpenCV 3.3.0:

    cd build cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D WITH_FFMPEG=ON -D WITH_TBB=ON -D WITH_GTK=ON -D WITH_V4L=ON -D WITH_OPENGL=ON -D WITH_CUBLAS=ON -DWITH_QT=OFF -DCUDA_NVCC_FLAGS="-D_FORCE_INLINES" .. make -j7 sudo make install

【讨论】:

我在 c++ 中也遇到了同样的错误。我尝试了所有可能的解决方案,但没有奏效。你能帮忙吗【参考方案5】:

我使用 Linux Mint,并使用 C++ 编程。我应用了与https://***.com/a/45893821/11247666 相同的程序。这是:

sudo apt-get install ffmpeg
sudo apt-get install libavcodec-dev libavformat-dev libavdevice-dev
cd opencv-3.3.0
cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local  -D WITH_FFMPEG=ON -D WITH_TBB=ON -D WITH_GTK=ON -D WITH_V4L=ON -D WITH_OPENGL=ON -D WITH_CUBLAS=ON -DWITH_QT=OFF -DCUDA_NVCC_FLAGS="-D_FORCE_INLINES" ..
make -j7
sudo make install

但是在这之后。问题是无法解决的。我有这个错误:

未指定错误(该功能未实现。使用 Windows、GTK+ 2.x 或 Carbon 支持重建库。如果您在 Ubuntu 或 Debian 上,请安装 libgtk2.0-dev 和 pkg-config,然后重新运行 cmake或配置脚本)在 cvNamedWindow 中。

我应用以下内容

sudo apt-get install libgtk2.0-dev
sudo apt-get install pkg-config

在此之后,我应用了相同的程序:

cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local  -D WITH_FFMPEG=ON -D WITH_TBB=ON -D WITH_GTK=ON -D WITH_V4L=ON -D WITH_OPENGL=ON -D WITH_CUBLAS=ON -DWITH_QT=OFF -DCUDA_NVCC_FLAGS="-D_FORCE_INLINES" ..
make -j7
sudo make install

以上对我有用。

【讨论】:

以上是关于opencv 无法停止流:设备的 ioctl 不合适的主要内容,如果未能解决你的问题,请参考以下文章

关于构造IOCTL命令的学习心得

ioctl (TUNSETIFF) : 设备或资源繁忙

ioctl“无法发送 spi 消息:无效参数”Beaglebone Black

自定义 linux 内核的 ioctl 突然停止响应并在几分钟后重新启动

来自 Netcat 的 OpenCV 流视频

IOCTL Linux 设备驱动程序 [关闭]