Pythonでフレームごとにタイムスタンプを取得する方法
以下でフレームごとにタイムスタンプが取得するためのget_timestamp()を作った。タイムスタンプは動画開始を0としたミリ秒での経過時間になる。 code:py
import cv2
def get_timestamps(video_path):
cap = cv2.VideoCapture(video_path)
while cap.isOpened():
frame_exists, curr_frame = cap.read()
if not frame_exists:
break
timestamp = cap.get(cv2.CAP_PROP_POS_MSEC)
timestamps.append(timestamp)
cap.release()
return timestamps
使い方
code:py
timestamps = get_timestamps('./D0002060252_00000_V_000.mp4')
for ts in timestamps:
print(ts)
code:出力
0.0
33.36666666666667
66.73333333333333
100.10000000000001
133.46666666666667
166.83333333333334
200.20000000000002
233.56666666666666
266.93333333333334
300.3
...(省略)...
23656.966666666667
23690.333333333332
23723.7
23757.066666666666
23790.433333333334
23823.8
23857.166666666668
23890.533333333333
23923.9
23957.266666666666
SHA256は7d861663a4014b4da53f6a3266a6331fab09bfd24d503be23fe60fce0e1a8cc1だった。何かのタイミングで更新されることもあると思う。 fps = cap.get(cv2.CAP_PROP_FPS)でFPSを計測すると29.97002997002997だった。
おまけ: 定数のFPSを使ったタイムスタンプとフレームごとのタイムスタンプの差
以下はコード。
code:py
import cv2
if __name__ == '__main__':
cap = cv2.VideoCapture('./sample_videos/D0002060252_00000_V_000.mp4')
fps = cap.get(cv2.CAP_PROP_FPS)
while cap.isOpened():
frame_exists, curr_frame = cap.read()
if frame_exists:
# フレームごとのタイムスタンプ
timestamps.append(cap.get(cv2.CAP_PROP_POS_MSEC))
# 1つ前のcalc_timestampsに1000/fpsを足したものを加える。
calc_timestamps.append(calc_timestamps-1 + 1000 / fps) else:
break
cap.release()
for i, (ts, cts) in enumerate(zip(timestamps, calc_timestamps)):
print('Frame %d difference:' % i, ts - cts)
code:出力
Frame 0 difference: 0.0
Frame 1 difference: 0.0
Frame 2 difference: 0.0
Frame 3 difference: 1.4210854715202004e-14
Frame 4 difference: 0.0
Frame 5 difference: 0.0
Frame 6 difference: 0.0
Frame 7 difference: -2.842170943040401e-14
Frame 8 difference: 0.0
Frame 9 difference: 0.0
...(省略)...
Frame 709 difference: 3.2014213502407074e-10
Frame 710 difference: 3.2014213502407074e-10
Frame 711 difference: 3.2378011383116245e-10
Frame 712 difference: 3.2378011383116245e-10
Frame 713 difference: 3.2741809263825417e-10
Frame 714 difference: 3.2741809263825417e-10
Frame 715 difference: 3.310560714453459e-10
Frame 716 difference: 3.310560714453459e-10
Frame 717 difference: 3.346940502524376e-10
Frame 718 difference: 3.346940502524376e-10
この結果から、定数なFPSを使った単純なタイムスタンプとフレームごとのタイムスタンプには差がある可能性あることが分かる。