V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
XuanYuan
V2EX  ›  问与答

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

  •  
  •   XuanYuan · 2014-03-27 14:22:53 +08:00 · 5417 次点击
    这是一个创建于 3886 天前的主题,其中的信息可能已经有所发展或是发生改变。
    20 条回复    1970-01-01 08:00:00 +08:00
    msg7086
        1
    msg7086  
       2014-03-27 16:48:31 +08:00
    导出timecode v2是比较方便的。25fps如果是mediainfo看的话不一定准的,vfr也说不定。
    GordianZ
        2
    GordianZ  
    MOD
       2014-03-27 17:09:37 +08:00
    你确定是 25 fps ?不是 24.97 fps?
    msg7086
        3
    msg7086  
       2014-03-27 17:17:15 +08:00
    @GordianZ 哪有这么奇怪的fps
    GordianZ
        4
    GordianZ  
    MOD
       2014-03-27 17:27:52 +08:00
    @msg7086 PAL 制式刷新率一半。
    XuanYuan
        5
    XuanYuan  
    OP
       2014-03-28 13:24:31 +08:00
    @msg7086 不好意思,还是没大听懂……
    msg7086
        6
    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
        7
    xuzhe  
       2014-03-28 14:44:50 +08:00
    25 fps 只是为了交流时说话能简单一点。
    真实帧数应该是 24.97 fps 才对吧……
    XuanYuan
        8
    XuanYuan  
    OP
       2014-03-28 14:51:17 +08:00
    @msg7086 我网上搜了一下,用 mp4fpsmod_0.24 输出了 timecode v2,但是格式就是 40ms 的步进,更迷惑了。
    msg7086
        9
    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
        10
    XuanYuan  
    OP
       2014-03-28 16:21:10 +08:00
    @msg7086 是的。我们是把这个视频用在 IOS 程序中,播放的时候按照 40ms 的换算出来的 timecode 定位却是错的,有的会多几帧有的会少几帧。
    msg7086
        11
    msg7086  
       2014-03-29 04:52:45 +08:00
    @XuanYuan 我只能猜测跳转的时候是跳转到关键帧而不是当前帧。

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

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

    如果要考虑定位准确性的话,可以在编码时把每个片段的第一帧指定为关键帧 (x264可以用qpfile)
    XuanYuan
        18
    XuanYuan  
    OP
       2014-04-01 13:16:47 +08:00
    @msg7086 之前是用 AE 把每个片段都处理好,然后用 iFFmpeg 合并。
    msg7086
        19
    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
        20
    xuzhe  
       2014-04-24 22:19:31 +08:00
    @msg7086 多谢指点。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5386 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 08:00 · PVG 16:00 · LAX 00:00 · JFK 03:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.