オープンcvモジュールを使用してPythonを介してファイル(.avi)内のフレームの総数を知る方法。
可能であれば、すべての情報(解像度、fps、期間など)を使用して、ビデオファイルを取得できます。
新しいOpenCVバージョン(3.1.0を使用)では、次のように機能します。
import cv2
cap = cv2.VideoCapture("video.mp4")
length = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
print( length )
他の動画プロパティでも同様ですcv2.CAP_PROP_*
import cv2
cap = cv2.VideoCapture(fn)
if not cap.isOpened():
print "could not open :",fn
return
length = int(cap.get(cv2.cv.CV_CAP_PROP_FRAME_COUNT))
width = int(cap.get(cv2.cv.CV_CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT))
fps = cap.get(cv2.cv.CV_CAP_PROP_FPS)
詳細は here をご覧ください。
また、すべてが塩の粒で、すべてのそれらの小道具が必須ではなく、キャプチャ/ビデオコーデックで利用できないものもあります
Python 3.6.5(Anaconda))およびOpenCV 3.4.2での動作方法は次のとおりです。公式のOpenCV website に記載されています。
import cv2
cap = cv2.VideoCapture("video.mp4")
property_id = int(cv2.CAP_PROP_FRAME_COUNT)
length = int(cv2.VideoCapture.get(cap, property_id))
print( length )
時々バグのあるCV_CAP_PROP
ゲッターに依存しない別の解決策は、ループでビデオファイル全体をトラバースすることです。
解像度に関する情報の収集は、一部のコーデックが可変解像度をサポートしているため、複雑です(ビットレートが一定ではなく、事前定義された範囲をカバーするオーディオファイルのVBRと同様)。
[〜#〜] fps [〜#〜]は計算できますが、ここでは解像度と同じ問題があります-定数(CFR)対変数(VFR)。これは、マルチスレッドの問題です。個人的には、有効なフレームごとに増加するフレームカウンターを使用しますが、1秒の間隔でタイマー(バックグラウンドスレッドで実行)が現在のカウンターの値を保存してリセットします。ビデオに含まれるフレームの合計数もわかる場合、最後に平均/一定のフレームレートを計算するために、値をリストに保存できます。
このやや単純な方法の欠点は、ファイル全体をスキャンする必要があることです。ファイルが数時間かかる場合は、ユーザーが確実に認識できます。この場合、アプリケーションがロードされたビデオファイルに関するこの情報を収集している間、ユーザーに他のことをさせながら、それについて賢く、バックグラウンドプロセスでそれを行うことができます。
利点は、OpenCVが読み取れる限り、どのビデオファイルを使用しても、期待どおりに動作する場合と動作しない場合があるCV_CAP_PROP
とは異なり、非常に正確な結果が得られることです。