估计opencv中的帧数和fps

问题描述

我有一些 .mp4 视频,ffmpeg 向我展示了这个信息:

  Duration: 00:00:07.02,start: 0.000000,bitrate: 18001 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661),yuvj420p(pc,bt709/bt709/iec61966-2-1,progressive),886x1920,14299 kb/s,22.54 fps,60 tbr,600 tbn,1200 tbc (default)
    Metadata:
      rotate          : 270
      creation_time   : 2021-04-30T13:56:51.000000Z
      handler_name    : Core Media Video
      encoder         : 'avc1'
    Side data:
      displaymatrix: rotation of 90.00 degrees

据我所知应该是 7.02 秒 * 22.54 fps ~ 158 帧

当我尝试在 opencv 中读取它时:

def print_info_cap_reading(video_filepath):
    cap = cv2.VideoCapture(video_filepath)

    fps = cap.get(cv2.CAP_PROP_FPS)
    n_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))

    print('fps:',round(fps,2))
    print('n_frames',n_frames)

    counter = 0
    while True:
        ret,frame = cap.read()
        if ret == False:
            break
        counter += 1

    print('counter:',counter)

显示给我

# fps: 22.54
# n_frames 199
# counter: 175

当我尝试通过 ffmpeg 将其转换为单独的帧时,它会生成 422 帧:

ffmpeg -i source1.mp4 tmp/img%03d.jpg

所以我想知道:

  1. 为什么 fps 是浮点值而不是整型值?
  2. 估算 fps 和帧数的正确方法是什么?
  3. 为什么 opencv 中的 cv2.CAP_PROP_FRAME_COUNT 和实际读取帧会产生不同数量的帧?

更新:

-ignore_editlist 1 没有帮助,ffmpeg 仍然产生 422 帧:

 ffmpeg -i source1.mp4 tmp1/img%03d.jpg
 ffmpeg -i source1.mp4 -ignore_editlist 1 tmp2/img%03d.jpg

这是一些 ffmpeg 输出

Output #0,image2,to 'tmp1/img%03d.jpg':
  Metadata:
    major_brand     : qt
    minor_version   : 0
    compatible_brands: qt
    com.apple.quicktime.author: ReplayKitRecording
    encoder         : Lavf58.45.100
    Stream #0:0(und): Video: mjpeg,yuvj420p(pc),1920x886,q=2-31,200 kb/s,60 fps,60 tbn,60 tbc (default)
    Metadata:
      encoder         : Lavc58.91.100 mjpeg
      creation_time   : 2021-04-30T13:56:51.000000Z
      handler_name    : Core Media Video
    Side data:
      cpb: bitrate max/min/avg: 0/0/200000 buffer size: 0 vbv_delay: N/A
      displaymatrix: rotation of -0.00 degrees
frame=  422 fps=224 q=24.8 Lsize=N/A time=00:00:07.03 bitrate=N/A dup=247 drop=0 speed=3.74x
video:13709kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unkNown

更新:

mkdir tmp3 && ffmpeg -ignore_editlist 1 -i source1.mp4 tmp3/img%03d.jpg 产生更多帧 - 529。

Output #0,to 'tmp3/img%03d.jpg':
  Metadata:
    major_brand     : qt
    minor_version   : 0
    compatible_brands: qt
    com.apple.quicktime.author: ReplayKitRecording
    encoder         : Lavf58.45.100
    Stream #0:0(und): Video: mjpeg,60 tbc (default)
    Metadata:
      encoder         : Lavc58.91.100 mjpeg
      creation_time   : 2021-04-30T13:56:51.000000Z
      handler_name    : Core Media Video
    Side data:
      cpb: bitrate max/min/avg: 0/0/200000 buffer size: 0 vbv_delay: N/A
      displaymatrix: rotation of -0.00 degrees
frame=  529 fps=221 q=24.8 Lsize=N/A time=00:00:08.81 bitrate=N/A dup=330 drop=0 speed=3.68x
video:16178kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unkNown

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)