概要
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