【问题标题】:Number of frames in a video using PyAV使用 PyAV 的视频中的帧数
【发布时间】:2018-11-18 21:48:31
【问题描述】:

我使用 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))

我显然可以使用其他库来加载库,但是由于其处理速度,我更喜欢使用 PyAV。

问题一: 是否可以用 PyAV 获取帧数?如果是,如何?

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

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

【问题讨论】:

    标签: python opencv video moviepy pyav


    【解决方案1】:

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

    container = av.open("My_Super_Video.mp4")
    total_frames = container.streams.video[0].frames
    

    【讨论】:

    • 我试过这个并返回 0 帧,所以这似乎只在某些时候有效。
    • frames 是 AVStream 结构的 nb_frame 属性的代理,根据ffmpeg docs,如果未知,则为 0。不确定何时会发生这种情况,也许某些编解码器不包含该信息?
    【解决方案2】:

    您可以通过 Stream.frames 属性获取流中的帧数。

    来源:http://docs.mikeboers.com/pyav/develop/api/stream.html#av.stream.Stream

    【讨论】:

      猜你喜欢
      • 2019-02-09
      • 2021-08-08
      • 2021-08-21
      • 1970-01-01
      • 2015-04-14
      • 1970-01-01
      • 1970-01-01
      • 2019-03-10
      • 1970-01-01
      相关资源
      最近更新 更多