diff -urN rt_v26/img.py rt_v27/img.py --- rt_v26/img.py 2018-04-20 23:52:43.000000000 +0900 +++ rt_v27/img.py 2018-04-22 21:50:00.000000000 +0900 @@ -57,22 +57,45 @@ fps = dic.get('fps') n = dic.get('n') + def err_recover(): + if vc.isOpened(): + vc.open(fn) + if 'img' in dic: + dic.pop('img') + if get_prop('i') != 0: + set_prop('i', 0) + + # get_prop(7) is doubt + for i in range(n): + (ret, _) = vc.read() + if not ret or len(_) == 0: + dic['n'] = n = i + break + err_recover() + def img_idx(i): i %= n # loop - if dic.get('i') != i: - set_prop('i', i) + if 'img' in dic and dic.get('i') != i: + dic.pop('img') + if dic.get('i')+1 != i: + set_prop('i', i) dic['i'] = i - if 'img' in dic: - dic.pop('img') if 'img' not in dic: ( ret, dic['img'] ) = vc.read() + if not ret: + err_recover() + for j in range(i+1): + ( ret, dic['img'] ) = vc.read() + if not ret: + sys.stderr.write( 'err {} {}/{}\n'.format( fn, j, dic.get('n') ) ) + dic['i'] = i return dic.get('img') dic['img_idx'] = img_idx sec_to_i = lambda sec: int(fps * sec) dic['img_sec'] = lambda sec: img_idx( sec_to_i(sec) ) - dic['imgs'] = lambda : map( img_idx, range(n) ) # func + dic['imgs'] = lambda : ut.map_lst( img_idx, range(n) ) # func return dic