Pythonだけでは動画再生時間は取得できません。
だからOpenCVを使います。
ところがOpenCVにも少し不便なことがあって、
- 再生時間を直接は取得できない、
- FPS・フレーム数から間接的に求める
このような求め方が必要になってきます。
再生時間の取得方法について少し解説
初めに動画関連で知っておくべき用語について
もしPythonで動画再生時間を取得したいなら…
最低限でも以下の意味は知っておくべきです。
- フレーム数
動画はパラパラ漫画のように1つ1つの画像で構成されている。この1つ1つの画像のことをフレームと呼んでいる。
- フレームレート/FPS
動画1秒あたりに何フレームが含まれるのが = Frames Per Seconds。例えば20FPSなら1秒あたりに20回のフレーム(画像)が含まれてるってこと
- ミリ秒単位
日常では時間をあらわすのに秒(seconds)を使うが、その1000分の1の単位としてミリ秒(millis)が用意されている。例えば 3000ミリ秒 = 3秒 など
OpenCV APIでは動画のFPSは取得できます。
それから動画の総フレーム数も取得できます。
でも動画再生時間を返すメソッドはありません。
でも上記を利用して間接的に求めることは可能です。
動画再生時間は「総フレーム数/FPS」で算出
では動画再生時間を次の2つで計算したいとします。
▼ Python+OpenCVで取得できる2つのメタ情報
- FPS = フレームレート
- FRAMES = 動画の総フレーム数
その場合、以下の式で再生時間は算出できます。
▼ この式で再生時間(秒)が分かる
1 |
再生時間 = FRAMES / FPS |
総フレーム数をFPSで割るだけ
先ほど説明したようにFPS = 1秒あたりのフレーム数でした。そして 総フレーム数 = FPS * 再生時間 だから再生時間を求め方はこうなるわけです。
これだけのシンプルな話です。
OpenCVで動画再生時間を求めるコード例
それでは実際のPythonコードについて
OpenCVを使った動画再生時間の求め方は以下です。
▼ Python+OpenCVでのコード例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
import cv2 import math ## 動画を読み込み vidcap = cv2.VideoCapture("/path/to/video.mp4") ## フレームレート(FPS) fps = vidcap.get(cv2.CAP_PROP_FPS) ## フレーム総数 total_frames = vidcap.get(cv2.CAP_PROP_FRAME_COUNT) ## 再生時間を秒で算出 time_in_secs = total_frames / fps ## 再生時間をミリ秒で算出 time_in_millis = time_in_secs * 1000 ## 出力 print("FPS : %d" % fps) print("frames : %d" % total_frames) print("time : %s secs" % f'{time_in_secs:.3f}') print("time : %s millis" % f'{time_in_millis:.0f}') |
▼ このコードをある動画で試した出力結果
1 2 3 4 |
FPS : 15 frames : 1889 time : 125.933 secs time : 125933 millis |
再生時間をミリ秒単位で取得できました。
今回のコードを書いていても分かる通り、
- 動画は再生時間をメタ情報に持たない
- FPS・フレーム総数から算出できるだけ
今まで再生時間もメタ情報だと思い込んでました。
でも動画時間は副次的なものなんですね。なるほど
再生時間を直接取得できないことに注意
ここまでで何度も書いたように…
1 |
再生時間 = FRAMES / FPS |
OpenCVではこのように再生時間を求めます。
直に再生時間を取得できないので注意です。
以上、Pythonで動画再生時間取得でした。ではまた