Пакет Python Imageio должен делать то, что вы хотите. Вот фрагмент python, использующий этот пакет:
import pylab
import imageio
filename = '/tmp/file.mp4'
vid = imageio.get_reader(filename, 'ffmpeg')
nums = [10, 287]
for num in nums:
image = vid.get_data(num)
fig = pylab.figure()
fig.suptitle('image #{}'.format(num), fontsize=20)
pylab.imshow(image)
pylab.show()
![введите здесь описание изображения](https://i.stack.imgur.com/ynfsE.png)
![введите здесь описание изображения](https://i.stack.imgur.com/QVMyZ.png )
Вы также можете напрямую перебирать изображения в файле (см. документацию):
for i, im in enumerate(vid):
print('Mean of frame %i is %1.1f' % (i, im.mean()))
Чтобы установить imageio, вы можете использовать pip:
pip install imageio
Другим решением было бы использовать moviepy (который использует аналогичный код для чтения видео), но я думаю imageio легче и выполняет свою работу.
ответ на первый комментарий
Чтобы проверить, одинакова ли номинальная частота кадров для всего файла, вы можете подсчитать количество кадров в итераторе:
count = 0
try:
for _ in vid:
count += 1
except RuntimeError:
print('something went wront in iterating, maybee wrong fps number')
finally:
print('number of frames counted {}, number of frames in metada {}'.format(count, vid.get_meta_data()['nframes']))
In [10]: something went wront in iterating, maybee wrong fps number
number of frames counted 454, number of frames in metada 461
Чтобы отобразить временную метку каждого кадра:
try:
for num, image in enumerate(vid.iter_data()):
if num % int(vid._meta['fps']):
continue
else:
fig = pylab.figure()
pylab.imshow(image)
timestamp = float(num)/ vid.get_meta_data()['fps']
print(timestamp)
fig.suptitle('image #{}, timestamp={}'.format(num, timestamp), fontsize=20)
pylab.show()
except RuntimeError:
print('something went wrong')
person
head7
schedule
20.04.2015
imageio
, что также решает проблему доступа к определенному номеру кадра, который также упоминается в вашем обзоре. - person gaggio   schedule 21.04.2015