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

use*_*946 6 video mp4 quicktime avfoundation avplayer

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

什么可能导致忽略开始帧?这是一个计时器倒计时的屏幕截图,比较Quicktime与Firefox在零时间.注意Firefox播放器如何在9:55启动,而Quicktime播放器则跳到9:54. 在此输入图像描述

这是我的样本mp4文件,如果你想亲眼看看.

谢谢

Rom*_* R. 5

该文件有一个Edit 原子,它定义文件的一部分作为轨道播放。

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

FFmpeg 票证中讨论了类似的情况:adher to start media time in QuickTime edts/elst

Quicktime 和 VLC 随后根据编辑列表播放文件,但 ffmpeg 使用整个时间线。


Mic*_*ick 4

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

使用 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

在此输入图像描述

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

在此输入图像描述

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

  • 5742/6000 = 0.957

这与 ffprobe 报告的“开始时间”以及 OP 报告的延迟相对应。