Как читать байты MKV как видео? - PullRequest
1 голос
/ 10 июля 2019

Я получаю фрагмент видео MKV в байтах. Мне нужно взять 1-й кадр для дальнейшей обработки без сохранения видео на диске. Для аналогичной проблемы с изображением я использую OpenCV или PIL, и все работает нормально, однако я не могу сделать то же самое с видеоданными. Какие-нибудь советы, как читать видео из байтов в объект памяти, который я мог бы использовать для дальнейшей обработки с помощью OpenCV или какой-либо другой библиотеки?

1 Ответ

1 голос
/ 10 июля 2019

Поскольку у меня нет вашего bytes буфера, я просто создал видеофайл MKV с ffmpeg, например так:

ffmpeg -i SomeVideo.avi -f matroska -vcodec libx264 video.mkv

Затем я установил imageio с:

pip install imageio

Затем я загрузил все видео MKV в память, поэтому у меня есть что-то, что должно выглядеть примерно так же, как bytes объект, который вы получаете, хранящийся в моей переменной content:

import imageio

# Get bytes of MKV video
with open('video.mkv', 'rb') as file: 
    content = file.read()

Теперь я должен быть настроен и выглядеть так же, как вы.Просто для справки, первые несколько байтов content выглядят так:

b'\x1aE\xdf\xa3\x01\x00\x00\x00\x00\x00\x00#B\x86\x81\x01B\xf7\x81\x01'

Итак, продолжим.

# Wrap the content in a BytesIO and get an ffmpeg reader to read it 
vid = imageio.get_reader(BytesIO(content),  'ffmpeg')

Теперь я могу напечатать среднее значение для каждого кадра следующим образом:

for num, image in enumerate(vid.iter_data()): 
    print(image.mean())

Или получите метаданные и напечатайте их следующим образом:

metadata = vid.get_meta_data()                                                             

print(metadata)

{'plugin': 'ffmpeg',
 'nframes': 750,
 'ffmpeg_version': '4.1 built with Apple LLVM version 10.0.0 (clang-1000.11.45.5)',
 'fps': 25.0,
 'source_size': (1280, 720),
 'size': (1280, 720),
 'duration': 30.0}

Ключевые слова : Python, видео, кадр, отдельный кадр, FFmpeg, imageio,один кадр, BytesIO, байты, MKV, Matroska.

...