我有一个非常奇怪的问题。我的OSX应用程序正在生成基于屏幕投射的mp4视频。出于某种原因,如果我在Quicktime或任何基于OSX的AVPlayer中打开此视频,它将在第0帧之前大约14-15帧开始。如果我使用Chrome或Firefox打开mp4,它实际上将在第0帧开始播放
什么可能导致忽略开始帧?这是一个计时器倒计时的屏幕截图,比较Quicktime与Firefox在零时间。注意Firefox播放器如何在9:55启动,而Quicktime播放器则跳到9:54。
如果你想亲眼看看,这是我的sample mp4 file。
由于
答案 0 :(得分:3)
这是一个有趣的问题,你的例子很好地说明了效果。
使用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 Media播放器也似乎从头开始,而不是偏移)。更新:Roman在下面指出这是一个已知的行为,并且已在ffmpeg列表中进行了讨论(参见Roman的回答)。这可能是由于mp4容器格式的历史,它源自Apple QuickTime规范。
start参数的用途似乎是允许轨道偏移以用于同步目的。为什么在仅包含一首曲目的视频中存在这种情况尚不清楚。
更新:这可能是任何人想要的更多信息,但对于那些感兴趣的人......
继续罗马的回答后,我使用MP4浏览器更详细地了解了mp4文件。由此我们可以首先看到时间尺度'这部电影:
然后编辑原子(或编辑框作为原子有时也会在mp4世界中调用):
编辑原子中的时间字段告诉玩家跳过第一个5742'样本'并从那里开始。将此信息与时间刻度一起使用,它告诉我们每秒有多少样本,我们可以计算它应该延迟的时间:
这对应于“开始时间”' ffprobe报告,以及OP报告的延迟。
答案 1 :(得分:3)
该文件有一个Edit atom,它定义了要作为曲目播放的文件的一部分。
有些解复用器将其考虑在内(从54:24开始)而其他人则忽略(从55:24开始)。
此处在FFmpeg票证中讨论了类似的案例:adher to start media time in QuickTime edts/elst。
Quicktime和VLC随后根据编辑列表播放文件,但ffmpeg使用整个时间轴。