Python 检查损坏的视频文件(捕获 OpenCV 错误)

Posted

技术标签:

【中文标题】Python 检查损坏的视频文件(捕获 OpenCV 错误)【英文标题】:Python check for corrupted video file (catch OpenCV error) 【发布时间】:2018-09-19 21:35:32 【问题描述】:

我正在寻找一种方法来检查视频文件是否损坏。

我正在使用 cv2(Python 的 OpenCV)来加载视频。 如果视频文件损坏,我想跳过该文件并继续下一个。

我发现了这个*** question,因此尝试了这个:

try:
    vid = cv2.VideoCapture(corrupt_video_file)
except cv2.error as e:
    print(e)
except:
    print('error')

但我仍然收到以下错误:

[mov,mp4,m4a,3gp,3g2,mj2 @ 0x1b2d000] moov atom not found Unable to stop the stream: Inappropriate ioctl for device OpenCV Error: Unspecified error (GStreamer: unable to start pipeline ) in cvCaptureFromCAM_GStreamer, file /home/student/programs/opencv-3.4.0/modules/videoio/src/cap_gstreamer.cpp, line 890 VIDEOIO(cvCreateCapture_GStreamer (CV_CAP_GSTREAMER_FILE, filename)): raised OpenCV exception:

/home/student/programs/opencv-3.4.0/modules/videoio/src/cap_gstreamer.cpp:890: error: (-2) GStreamer: unable to start pipeline  in function cvCaptureFromCAM_GStreamer

似乎引发了 cpp 错误,而不是 python 错误。 (我从源代码编译了opencv,其他项目需要)

是否也可以捕获这些 cpp 错误? 或者还有其他方法可以在 python 中检查损坏的视频文件吗? 还是问题出在我自己编译的openCV,而不仅仅是安装了python-cv2?

欢迎任何帮助或建议!

【问题讨论】:

OpenCV 有这种parroting all the error messages to stderr 的习惯,即使你捕获了异常,直到最近,在 Python 中还没有很好的方法来阻止它。 GStreamer 可能也在做同样的事情——我个人不使用它,但我记得可能有一些编译标志来改变这种行为,环顾四周。在这里很难说,因为您混合了两个流并且在捕获异常时您只需打印它。 【参考方案1】:

还是问题出在我自己编译了openCV,而不仅仅是安装了python-cv2?

这应该很容易测试:只需使用 release version 运行您的脚本。

是否也可以捕获这些 cpp 错误?

由于您可以自己编译 OpenCV,您可能有机会找到 #define 来控制错误行为。我快速浏览了一下,但这对于“初学者”来说非常重要,所以我只能提供一些文档和源代码的链接,您可以从以下位置开始搜索:

cap_gstreamer.cpp#L890 调用封装了cv::error() 的宏CV_Error (source)。

库甚至可能使用环境变量或标志来抑制这些错误(无需重新编译)。

但是由于您已经在编译,当然您可以尝试“破解”源代码以忽略错误。

您可能会在 http://answers.opencv.org/questions/ 找到实际帮助,甚至可能来自开发人员。


对不起,我误读了这个问题。我通过pip3.exe install opencv-python 安装了OpenCV(see PyPi,官方下载只是给你一个zip 文件,没有明显的Python 使用说明)。

简单地测试isOpened 似乎有效:

#!python3
"""https://***.com/a/49751695/1619432"""
import sys
import cv2  # https://pypi.python.org/pypi/opencv-python

filename = "big_buck_bunny.mp4"

# info
print("Python:", sys.version)
print("CV2:   ", cv2.__version__)
print(filename)

# create empty file
if False:
    with open(filename, "wb") as f:
        pass

# produce error
try:
    vid = cv2.VideoCapture(filename)
    if not vid.isOpened():
        raise NameError('Just a Dummy Exception, write your own')
except cv2.error as e:
    print("cv2.error:", e)
except Exception as e:
    print("Exception:", e)
else:
    print("no problem reported")

print("done")

文件不存在:

Python: 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18) [MSC v.1900 64 bit (AMD64)]
CV2:    3.4.0
does_not_exist.mp4
warning: Error opening file (/build/opencv/modules/videoio/src/cap_ffmpeg_impl.hpp:808)
warning: does_not_exist.mp4 (/build/opencv/modules/videoio/src/cap_ffmpeg_impl.hpp:809)
Exception: Just a Dummy Exception, write your own
done

零字节文件:

Python: 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18) [MSC v.1900 64 bit (AMD64)]
CV2:    3.4.0
does_exist.mp4
[mov,mp4,m4a,3gp,3g2,mj2 @ 000000a171d82880] moov atom not found
warning: Error opening file (/build/opencv/modules/videoio/src/cap_ffmpeg_impl.hpp:808)
warning: does_exist.mp4 (/build/opencv/modules/videoio/src/cap_ffmpeg_impl.hpp:809)
Exception: Just a Dummy Exception, write your own
done

有效文件

Python: 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18) [MSC v.1900 64 bit (AMD64)]
CV2:    3.4.0
big_buck_bunny.mp4
no problem reported
done

请参阅Errors 上的 Python 教程,了解如何处理异常并编写自己的。

为了抑制错误消息,签出可能会在上面删除部分,或者它们可能只是被重定向(管道到无处)。

或者有没有其他方法可以在 python 中检查损坏的视频文件?

您可以尝试找到一个外部程序,该程序具有检查但实际上不播放文件的选项(可能是VLC、ffmpeg、..)并从 Python 运行并与之通信(例如 subprocess) .


Python 的 API 文档:cv2.VideoCapture()

【讨论】:

我遇到了同样的错误,检查“isOpened”允许我跳过损坏的视频并继续下一个。但是,仍然会打印错误消息。

以上是关于Python 检查损坏的视频文件(捕获 OpenCV 错误)的主要内容,如果未能解决你的问题,请参考以下文章

Python3 使用filetype包查找指定目录中所有损坏的文件(图片,视频,音频等文件)

手动检查 php 中的 jpeg 文件末尾标记 ffd9 (?) 以捕获截断错误

检查图片是否损坏图片后缀是否与实际图片类型对应 - Python

检测损坏的png文件的有效方法?

Python OpenCV videocapture 不从源捕获视频

文件破损怎么办