ffmpeg 输出 25fps 视频的第一帧仅显示 1ms

ffmpeg outputs that the first frame of a 25fps video shows for only 1ms

我正在使用 ffmpeg 按帧分割视频。对于 25fps 的视频,我的期望是它会显示第 0 帧 40 毫秒,然后它会显示第 1 帧 40 毫秒,等等。但是,当我使用 ffmepg 分析视频时,这不是我得到的。

我使用以下命令从视频中提取帧:

ffmpeg -i original.mp4 -ss 00:00:00.000 -vframes 1 0.000.png
ffmpeg -i original.mp4 -ss 00:00:00.001 -vframes 1 0.001.png
ffmpeg -i original.mp4 -ss 00:00:00.040 -vframes 1 0.040.png
ffmpeg -i original.mp4 -ss 00:00:00.041 -vframes 1 0.041.png

在此,我希望 0.000.png0.001.png 是同一帧,但生成的 png 不同。但是,另一方面,0.001.png0.040.png 是同一帧,而 0.040.png0.041.png 是不同的帧。 0.000.png 处的帧似乎只显示了 1 毫秒。我已经在多个不同的视频上对此进行了测试,结果一致。谁能解释这是为什么,或者为什么我的期望可能不正确?

附带说明一下,当我将同一视频加载到浏览器中的 HTML5 视频标签时,当我播放视频时,第一帧显示 64 毫秒,所有其他帧显示 40 毫秒.我可以通过比较以下命令的帧来测试它:

player.currentTime = 0
player.currentTime = .063 // same frame as 0
player.currentTime = .064 // different frame than .063
player.currentTime = .103 // same frame as .064
player.currentTime = .104 // different frame than .103

这也出乎意料,让 ffmpeg 视频和 html5 视频之间的匹配 frames/times 更加烦人。有人知道这里发生了什么吗?

如果有帮助,这里是视频中的元数据:

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'original.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.17.101
  Duration: 01:36:16.20, start: 0.000000, bitrate: 2301 kb/s
    Stream #0:0(und): Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 2200 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 96 kb/s (default)
    Metadata:
      handler_name    : SoundHandler

-ss 将匹配第一帧 指定时间戳之后。

至于第一帧持续时间和后续视频帧时间戳,你的文件有一个 AAC 音轨,它有一个 ,看起来 browser/player 没有跳过启动样本,并偏移视频时间戳以保持同步。