请问如何精确地定位 MP4 文件的精确到毫秒的 time stamp?因为某些原因把几个视频合并成了一个,现在在播放器里面需要根据时间轴去定位。视频文件是 25fps,我按照帧数换算出来好像不对。

2014-03-27 14:22:53 +08:00
 XuanYuan
5455 次点击
所在节点    问与答
20 条回复
msg7086
2014-03-27 16:48:31 +08:00
导出timecode v2是比较方便的。25fps如果是mediainfo看的话不一定准的,vfr也说不定。
GordianZ
2014-03-27 17:09:37 +08:00
你确定是 25 fps ?不是 24.97 fps?
msg7086
2014-03-27 17:17:15 +08:00
@GordianZ 哪有这么奇怪的fps
GordianZ
2014-03-27 17:27:52 +08:00
@msg7086 PAL 制式刷新率一半。
XuanYuan
2014-03-28 13:24:31 +08:00
@msg7086 不好意思,还是没大听懂……
msg7086
2014-03-28 14:12:56 +08:00
@XuanYuan 导出timecode v2。

我所知道的几种方法。
- dtsedit工具
- FFVideoSource()可以导出tc
- l-smash里的box dumper可以导出DTS+CTS的timecode,你需要自己parse
- 转成mkv以后用mkvextract timecode_v2

@GordianZ 就算是PAL也应该是25p或者50i吧
xuzhe
2014-03-28 14:44:50 +08:00
25 fps 只是为了交流时说话能简单一点。
真实帧数应该是 24.97 fps 才对吧……
XuanYuan
2014-03-28 14:51:17 +08:00
@msg7086 我网上搜了一下,用 mp4fpsmod_0.24 输出了 timecode v2,但是格式就是 40ms 的步进,更迷惑了。
msg7086
2014-03-28 15:45:44 +08:00
@XuanYuan 那就没什么问题啊,1s/25 = 40ms没错。

@xuzhe NTSC制式常见有24p/1.001与30p/1.001两种,PAL我只知道25p,如果你手头有正式出版物是25p/1.001=24.97fps的话欢迎指出。
XuanYuan
2014-03-28 16:21:10 +08:00
@msg7086 是的。我们是把这个视频用在 IOS 程序中,播放的时候按照 40ms 的换算出来的 timecode 定位却是错的,有的会多几帧有的会少几帧。
msg7086
2014-03-29 04:52:45 +08:00
@XuanYuan 我只能猜测跳转的时候是跳转到关键帧而不是当前帧。

解码某一特定帧时必须要从关键帧开始解码。
XuanYuan
2014-03-31 09:03:36 +08:00
@msg7086 谢谢谢谢!
如果这样的话,那我该怎样处理这个视频呢?插入空白帧来把每个动作的开始帧都定到关键帧?
msg7086
2014-03-31 16:27:13 +08:00
@XuanYuan 能把场景描述得更具体点么?暂时还不太明白为什么播放器需要毫秒级帧定位……
XuanYuan
2014-03-31 17:53:53 +08:00
@msg7086 方便的话加我一下 Q 吧?求大侠指点。我的是 11868722
msg7086
2014-03-31 19:08:31 +08:00
@XuanYuan 平时懒得上Q了,百来个群闪着太容易分心了……

能详细说的话还是在这说吧,比较方便
XuanYuan
2014-03-31 19:32:19 +08:00
@msg7086 我们是《美女德州扑克》开发商,游戏中的荷官有一套动作,每个动作1-3秒之间吧,在游戏中是随机触发的。为了数据安全考虑,我们将这些动作的视频合并成了一个文件然后进行了加密。
msg7086
2014-04-01 05:37:39 +08:00
@XuanYuan 你们合并是用的什么软件?

如果要考虑定位准确性的话,可以在编码时把每个片段的第一帧指定为关键帧 (x264可以用qpfile)
XuanYuan
2014-04-01 13:16:47 +08:00
@msg7086 之前是用 AE 把每个片段都处理好,然后用 iFFmpeg 合并。
msg7086
2014-04-02 05:30:55 +08:00
@XuanYuan 不知道我以下说的方法对你是不是太难,但是你可以试试。当然前提是你们是用的h.264。

首先AE导出所有片段连在一起的无损AVI

用virtualdub打开avi,找到每一段视频的开始位置的帧号

按照以下的格式写入一个名为qpfile.txt的文件里

150 I -1
250 I -1
300 I -1
.... I -1
其中第一列是帧号,后面的内容原样照抄。

然后调用x264压缩,压缩的时候记得加上这个参数 --qpfile qpfile.txt

比如 x264_tMod_8bit.exe --demuxer lavf --force-cfr --crf 18 --preset slow --tune animation --qpfile qpfile.txt -o output.mp4 input.avi 这样。

如果你们用的是ASP的话……不确定XviD有没有类似的功能了。而且真要用XviD的话不如直接上AVI容器来得简单粗暴
xuzhe
2014-04-24 22:19:31 +08:00
@msg7086 多谢指点。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/106124

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX