如何将 MKV 字节读取为视频?

py_*_*_ml 4 python opencv video-encoding mkv

我正在接收 MKV 视频片段(以字节为单位)。我需要获取它的第一帧以供以后处理,而不将视频保存在磁盘中。对于类似的图像问题,我使用 OpenCV 或 PIL,一切正常,但是,我无法对视频数据执行相同的操作。有什么技巧可以帮助我将视频从字节读取到内存对象,以便以后使用 OpenCV 或其他库进行处理吗?

Mar*_*ell 7

由于我没有你的bytes缓冲区,我只是创建了一个 MKV 视频文件,ffmpeg如下所示:

ffmpeg -i SomeVideo.avi -f matroska -vcodec libx264 video.mkv
Run Code Online (Sandbox Code Playgroud)

然后我安装imageio了:

pip install imageio
Run Code Online (Sandbox Code Playgroud)

bytes然后我将整个 MKV 视频加载到内存中,因此我得到的东西看起来必须与您收到的存储在我的变量中的对象几乎相同content

import imageio

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

现在我应该已经和你一样了。仅供参考,前几个字节content如下所示:

b'\x1aE\xdf\xa3\x01\x00\x00\x00\x00\x00\x00#B\x86\x81\x01B\xf7\x81\x01'
Run Code Online (Sandbox Code Playgroud)

那么,让我们继续吧。

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

我现在可以像这样打印每帧的平均值:

for num, image in enumerate(vid.iter_data()): 
    print(image.mean())
Run Code Online (Sandbox Code Playgroud)

或者获取元数据并像这样打印:

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}
Run Code Online (Sandbox Code Playgroud)

关键词:Python、视频、帧、单个帧、FFmpeg、imageio、单帧、BytesIO、字节、MKV、Matroska。