代码之家  ›  专栏  ›  技术社区  ›  Tom Brito

有人熟悉MP4数据结构吗?

  •  32
  • Tom Brito  · 技术社区  · 6 年前

    在哪里 mp4 file structure 它的持续时间是多少?

    9 回复  |  直到 8 年前
        1
  •  13
  •   Camilo Martin    14 年前

    这也许不是你问题的答案,但我的问题是: http://mediainfo.sourceforge.net/

    (它有一个库,而且是开源的,所以您可以检查您需要的部件)

        2
  •  8
  •   Aftershock    9 年前

    https://github.com/sannies/mp4parser 项目。它是一个Java库,它显示了MP4文件的结构。

        3
  •  6
  •   Kekoa    14 年前

    据我所知,“MP4”容器是从QuickTime原子结构派生而来的。您可以读取QuickTime文件格式的描述。

    分析QuickTime原子不是什么大问题(看 atomicParsley project )我不确定MP4,但对于mov文件,在“mvhd”(电影标题)atom和“tkhd”(曲目标题)atom中都有“duration”字段。此持续时间通常是乘以“时间刻度”属性的帧数。 时间尺度可以在同一个原子中找到。

        4
  •  6
  •   Paul Gregoire    14 年前

    对于red5 mp4阅读器,我使用了“mvhd”原子,因为它同时包含时间刻度和持续时间字段。根据所使用的版本,从Atom获取持续时间将有所不同,下面您可以看到一个示例:

    public long create_full_atom(MP4DataStream bitstream) throws IOException {
        long value = bitstream.readBytes(4);
        version = (int)value >> 24;
        flags = (int)value & 0xffffff;
        readed += 4;
        return readed;
    }

    public long create_movie_header_atom(mp4datastream bitstream)引发IOException{ 创建完整的原子(位流); 如果(版本==1){ creationTime=创建日期(bitstream.readbytes(8)); modificationtime=createdate(位流.readbytes(8)); 时间刻度=(int)位流.readbytes(4); 持续时间=bitstream.readbytes(8); 螺纹+=28; }否则{ creationTime=创建日期(bitstream.readbytes(4)); modificationtime=createdate(bitstream.readbytes(4)); 时间刻度=(int)位流.readbytes(4); 持续时间=bitstream.readbytes(4); 螺纹+=16; } int qt_preferredate=(int)位流.readbytes(4); int qt_preferredvolume=(int)位流.readbytes(2); bitstream.skipbytes(10个); long qt_matrixa=位流.readbytes(4); long qt_matrixb=位流.readbytes(4); long qt_matrixu=位流.readbytes(4); long qt_matrixc=位流.readbytes(4); long qt_matrixd=位流.readbytes(4); long qt_matrixv=位流.readbytes(4); long qt_matrixx=位流.readbytes(4); long qt_matrixy=位流.readbytes(4); long qt_matrixw=位流.readbytes(4); long qt_previewTime=位流.readbytes(4); long qt_previewDuration=位流.readBytes(4); long qt_postertime=位流.readbytes(4); long qt_selection time=位流.readbytes(4); long qt_selectionduration=位流.readbytes(4); long qt_currentTime=位流.readbytes(4); long nexttrackid=bitstream.readbytes(4); 螺纹+=80;
    返回螺纹;
    }
    在旁注中,我使用这些值计算播放时间和fps,如下所示:

        double fps = (videoSampleCount * timeScale) / (double) duration;
        double videoTime = ((double) duration / (double) timeScale);
    
    videosamplecount变量来自“stsz”原子。

        5
  •  4
  •   ewall    14 年前

    MP4 是一种“容器”格式,这基本上意味着它可以包含许多不同的音频或视频流。每个流可以有它自己的持续时间值…

    为了找出你需要的,你需要更多的参考文件。我建议你看看 here here …但是,您可能需要进一步搜索您想要支持的不同类型的A/V流。

        6
  •  1
  •   Francis Shanahan    11 年前
        7
  •  1
  •   Lorenzo Di Ciaccio    10 年前

    基本上MP4结构是一棵树。 宏观领域包括:

    • ftyp-文件类型
    • MOOV-包含元数据(歌曲标题、自动播放、URL和其他信息)
    • 空闲-空区域用于分隔头和数据
    • mdat-包含音频帧

    你可以试试这个免费软件MP4分析仪工具

    http://www.thinmultimedia.co.kr/products/MP4Reader_download.html

        8
  •  0
  •   Piotr Byzia    8 年前

    电影的持续时间在电影标题MVHD中。 持续时间(秒)由MVHD中的两个字段派生。

    • 4字节时间刻度
    • 4字节持续时间

    这些是@tom brito发布的规范中的第380和382行。

    所以给定时间刻度“ts”和持续时间“dur” Duration in seconds = dur / ts

        9
  •  -1
  •   Randall Cook    11 年前

    可以使用Media Box Viewer。它是MP4和QuickTime解析器。打开QuickTime文件时,可以看到Atom结构。寻找视频描述原子。它的一个属性是持续时间。可以从下载Media Box Viewer www.jdxsoftware.org .