読者です 読者をやめる 読者になる 読者になる

cv2(openCV)で動画の途中から再生する方法

概要

openCVで動画の任意の地点から再生を開始する方法をまとめる。
これまではwhileループで1フレームずつ取得し読み飛ばしていた。しかし、この方法はあまりにも無駄が多い・・・時間もかかるし、HDDにも悪影響が出そう。
ということで、もう少し効率の良い方法を調べてみた。

従来方法

飛ばしたい時間分フレームを読みこませるだけ、簡単だけど、100秒のスキップに10秒ほど時間がかかる。
流石にこれじゃねぇ・・・。ということで、次の手法。

movie = cv2.VideoCapture(input_filename)
if movie.isOpened() == True:
    ret,frame = movie.read()
else:
    ret = False


# フレームを連続で読み込ませる
for i in range(framerate*shift_time):
    ret,frame = movie.read()

高速手法

開始のゼロ点をms単位でセットしてあげるだけ。スキップはほぼ一瞬。
HDDへのアクセスも少なく、パソコンに優しい!

movie = cv2.VideoCapture(input_filename)
if movie.isOpened() == True:
    ret,frame = movie.read()
else:
    ret = False

#スタート地点をsetする
movie.set(0,shift_time*1000)
ret,frame = movie.read()

疑問点

h264動画を取得すると、以下のエラーが出る。
キーフレームが見つからないってことなんだろうけど・・・・。
このエラーが出てもとりあえず読み込めてるから、とりあえず用は足りる。
(キーフレームが出るまで再読込してるのかな??本当はopenCVのソース読んで確認すべき。)

[h264 @ 0x2f1fac0] Missing reference picture, default is 0
[h264 @ 0x2f1fac0] decode_slice_header error