mp4 视频在 Quicktime/AVplayer 和 Chrome/Firefox 的不同时间开始播放

mp4 video starts at different time on Quicktime/AVplayer vs Chrome/Firefox

我有一个很奇怪的问题。我的 OSX 应用程序正在根据截屏生成 mp4 视频。出于某种原因,如果我在 Quicktime 或任何基于 OSX 的 AVPlayer 中打开此视频,它将在第 0 帧之前大约 14-15 帧开始。如果我用 Chrome 或 Firefox 打开 mp4,它实际上会在第 0 帧开始播放。

什么会导致忽略开始帧?这是在时间为零时比较 Quicktime 与 Firefox 的计时器倒计时的屏幕截图。请注意 Firefox 播放器如何从 9:55 开始,而 Quicktime 播放器如何跳到 9:54。

这是我的 sample mp4 file 如果你想亲眼看看。

谢谢

这是一个有趣的问题,您的示例很好地说明了效果。

使用 ffprobe 查看您上面链接的文件给出:

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'c44116b.mp4':
  Metadata:
    major_brand     : qt  
    minor_version   : 0
    compatible_brands: qt  
    creation_time   : 2015-04-25 15:54:30
  Duration: 00:00:03.70, start: 0.957000, bitrate: 1164 kb/s
    Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(tv, bt709), 480x360 [SAR 1:1 DAR 4:3], 899 kb/s, 22.99 fps, 22.99 tbr, 6k tbn, 12k tbc (default)
    Metadata:
      creation_time   : 2015-04-25 15:54:30
      handler_name    : Core Media Data Handler
      encoder         : H.264

您可以在此处看到 ffprobe 报告的 'start' 为 0.957000,这对应于您的 1 秒偏移量。

这并不能解释为什么某些播放器遵守这一点而其他播放器忽略它(Windows 媒体播放器似乎也从头开始,而不是从偏移量开始)。更新:Roman 在下面指出这是一个已知行为,并且已经在 ffmpeg 列表中进行了讨论(请参阅 Roman 的回答)。这可能是由于 mp4 容器格式的历史,它是从 Apple QuickTime 规范发展而来的。

开始参数的目的似乎是为了同步目的允许轨道偏移。为什么这会出现在只有一首曲目的视频中尚不清楚。

更新:这可能是任何人都想要的更多信息,但对于那些感兴趣的人...

根据 Roman 的回答,我使用 MP4 浏览器更详细地查看了 mp4 文件。由此我们首先可以看出电影的'timescale':

然后是编辑原子(或编辑框,因为在 mp4 世界中有时也称为原子):

编辑原子中的时间字段告诉玩家跳过第一个 5742 'samples' 并从那里开始。将此信息与时间刻度一起使用,它告诉我们每秒有多少样本,我们可以计算它应该延迟的时间:

  • 5742/6000 = 0.957

这与 ffprobe 报告的 'start time' 以及 OP 报告的延迟相对应。

该文件有一个 Edit atom,它定义了文件的一部分作为曲目播放。

一些解复用器会考虑它(从 54:24 开始),而另一些则忽略它(从 55:24 开始)。

FFmpeg ticket 中讨论了类似的案例:adher to start media time in QuickTime edts/elst

Quicktime and VLC subsequently play the file back according to the edit list, but ffmpeg uses the entire timeline.