使用 PyAV 的视频中的帧数

Jon*_*IAR 5 python video opencv moviepy pyav

我使用 PyAV 库,因为它是 Python 可用的最快库之一。

这是我想使用的一个简单的代码示例:

import av

video = av.open("My_Super_Video.mp4")

total_frames = # ????

for i, frame in enumerate(video.decode(video=0)):
    img = frame.to_image()  # PIL image

    print("Frame: %d/%d ..." % (i, total_frames))
Run Code Online (Sandbox Code Playgroud)

显然我可以使用其他库来加载该库,但是如果可能的话,我更喜欢使用 PyAV,因为它的处理速度很快。

问题1:用PyAV可以获取帧数吗?如果是,怎么办?

问题2:在这种情况下,我会考虑使用另一个库来逐帧加载和处理视频。哪个库可以让我以尽可能最高的速度完成上述操作。我知道以下内容,但不知道它们如何比较:

  1. PIMS在 PyAV 之上,可以添加一些有趣的功能吗?
  2. MoviePy(仅限于适合 RAM 的视频),但是 perf 呢?
  3. Imageio(可能与上面相同的限制),但是 perf 呢?
  4. OpenCV(可能与上面相同的限制),但是 perf 呢?
  5. 其他的 ?

jns*_*jns 8

要获取第一个视频流的帧,请执行以下操作:

container = av.open("My_Super_Video.mp4")
total_frames = container.streams.video[0].frames
Run Code Online (Sandbox Code Playgroud)


Fir*_*ger 2

老问题,但只回答了部分。我也来回答第二个问题吧。

问题1:用PyAV可以获取帧数吗?如果是,怎么办?

import av

with av.open("My_Super_Video.mp4") as container:
    total_frames = container.streams.video[0].frames
Run Code Online (Sandbox Code Playgroud)

问题2:在这种情况下,我会考虑使用另一个库来逐帧加载和处理视频。哪个库可以让我以尽可能最高的速度完成上述操作。我知道以下内容,但不知道它们如何比较:[...]

ImageIO timings:  0.497
PyAV timings:     0.908
MoviePy timings:  0.766
OpenCV timings:   0.766
OpenCV timings:   0.569 (no conversion to RGB)
Run Code Online (Sandbox Code Playgroud)

ImageIO 是最快的;把手放下。OpenCV 很接近(慢 14%),但前提是您可以在 BGR 中进行处理。如果您必须以 RGB 工作,那么转换成本会很高(慢 54%)。

也就是说,它高度依赖于工作负载,您应该始终根据您的特定设置进行基准测试。实际上,与处理每帧所花费的时间相比,差异通常可以忽略不计。

这是感兴趣的人的基准代码:

ImageIO timings:  0.497
PyAV timings:     0.908
MoviePy timings:  0.766
OpenCV timings:   0.766
OpenCV timings:   0.569 (no conversion to RGB)
Run Code Online (Sandbox Code Playgroud)

封装版本:

av==10.0.0
moviepy==1.0.3
Pillow==9.4.0
opencv-python==4.7.0.68
imageio==2.25.0
Run Code Online (Sandbox Code Playgroud)