web-dev-qa-db-ja.com

Python破損したビデオファイルをチェックします(OpenCVエラーをキャッチします)

ビデオファイルが破損していないかどうかを確認する方法を探しています。

ビデオをロードするためにcv2(Pythonの場合はOpenCV)を使用しています。ビデオファイルが破損している場合は、ファイルをスキップして次のファイルに進みます。

私はこれを見つけました stackoverflowの質問 したがってこれを試しました:

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

pythonエラーではなく、cppエラーが発生したようです。(ソースからopencvをコンパイルしましたが、他のプロジェクトに必要でした)

それらのcppエラーもキャッチすることは可能ですか?
または、Pythonで破損したビデオファイルをチェックする他の方法はありますか?
それとも、python-cv2をインストールしただけでなく、openCVを自分でコンパイルしたことに問題があるのでしょうか。

どんな助けや提案も歓迎します!

7

それとも、python-cv2をインストールしただけでなく、openCVを自分でコンパイルしたことに問題がありますか?

テストは簡単です。スクリプトを リリースバージョン で実行するだけです。

それらのcppエラーもキャッチすることは可能ですか?

OpenCVを自分でコンパイルできるので、エラー時の動作を制御するために_#define_を理解する可能性があります。簡単に調べましたが、これは「初心者」にかなり関係しているので、検索を開始する可能性のあるドキュメントとソースコードへのリンクをいくつか紹介するだけです。

cap_gstreamer.cpp#L89 マクロを呼び出します _CV_Error_source )ラップします cv::error()

ライブラリによって使用される環境変数またはフラグでさえ、これらのエラーを(再コンパイルせずに)抑制することができる場合があります。

ただし、すでにコンパイルしているので、もちろん、ソースを「ハッキング」してエラーを無視することもできます。

おそらく実際のヘルプは http://answers.opencv.org/questions/ で、おそらく開発者からでも見つけることができます。


申し訳ありませんが、質問を読み間違えました。 _pip3.exe install opencv-python_を介してOpenCVをインストールしました( PyPiを参照 、公式ダウンロードでは、Pythonで使用するための明確な手順がないZipファイルが提供されます)。

単にテストする 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(eg subprocess)から実行して通信します。


PythonのAPIドキュメント: cv2.VideoCapture()

4
handle