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

时间:2018-04-10 09:56:33

标签: python opencv video cv2

我正在寻找检查视频文件是否已损坏的方法。

我使用cv2(OpenCV for python)来加载视频。 如果视频文件已损坏,我想跳过该文件并转到下一个文件。

我找到了stackoverflow 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?

欢迎任何帮助或建议!

1 个答案:

答案 0 :(得分:1)

  

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

测试应该很简单:只需使用release version运行脚本。

  

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

由于您可以自己编译OpenCV,因此您可能有机会找出#define来控制错误行为。我快速浏览了一下,但这对于“不熟悉”非常复杂,所以我只能提供一些文档和源代码的链接,你可以开始搜索:

cap_gstreamer.cpp#L890调用包裹CV_Error的宏sourcecv::error())。

库甚至可能存在可以实现抑制这些错误的环境变量或标志(无需重新编译)。

但是既然你已经编译了,当然你可以尝试“破解”源代码来忽略错误。

您可以在http://answers.opencv.org/questions/找到实际的帮助,甚至可以从开发人员那里找到帮助。

抱歉,我误解了这个问题。我通过pip3.exe install opencv-pythonsee PyPi安装了OpenCV,官方下载只给你一个zip文件,没有明确的Python使用说明。)

简单地测试isOpened似乎有效:

#!python3
"""https://stackoverflow.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中检查损坏的视频文件吗?

您可以尝试查找一个外部程序,该程序可以选择检查但不实际播放该文件(可能是VLCffmpeg,..)并运行并通过Python与它通信(例如subprocess)。

Python的API文档:cv2.VideoCapture()