我正在寻找一种检查视频文件是否已损坏的方法。
我正在使用cv2(用于python的OpenCV)来加载视频。 如果视频文件已损坏,我想跳过该文件并继续下一个文件。
我发现了这个堆栈溢出问题,因此尝试了这个:
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,而不仅仅是安装了 python-cv2?
这应该很容易测试:只需使用发布版本运行脚本即可。
是否有可能捕获这些 cpp 错误?
由于您能够自己编译OpenCV,因此您可能有机会找出一种
#define
来控制错误时的行为。我快速浏览了一下,但这对"外行"来说非常复杂,所以我只能提供一些指向文档和源代码的链接,您可能会开始搜索:
cap_gstreamer.cpp#L890 调用包装cv::error()
的宏CV_Error
(源)。
甚至可能有一些库使用的环境变量或标志可以实现抑制这些错误(无需重新编译)。
但是由于您已经在编译,当然您可以尝试"破解"源代码以忽略错误。
您可能可以在 http://answers.opencv.org/questions/找到实际的帮助,甚至可能来自开发人员。
对不起,我误读了这个问题。我通过pip3.exe install opencv-python
安装了OpenCV(参见PyPi,官方下载只是给你一个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
请参阅关于错误的 Python 教程,了解如何处理异常并编写自己的异常。
要抑制错误消息,请查看上面的删除线部分,或者可以将它们重定向(管道无处可去)。
或者有没有其他方法可以在python中检查损坏的视频文件?
您可以尝试找到一个外部程序,该程序可以选择检查但实际上不播放文件(可能是VLC,ffmpeg等),并从Python运行并与之通信(例如subprocess
)。
Python 的 API 文档:cv2。视频捕获()