mp4 文件结构中的持续时间在哪里?
9 回答
这可能不是你的问题的答案,但它是我的:http: //mediainfo.sourceforge.net/
(它有一个库并且是开源的,所以你可以检查你需要的部分)
请参阅https://github.com/sannies/mp4parser项目。它是一个显示 mp4 文件结构的 Java 库。
对于 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) throws IOException {
create_full_atom(bitstream);
if (version == 1) {
creationTime = createDate(bitstream.readBytes(8));
modificationTime = createDate(bitstream.readBytes(8));
timeScale = (int)bitstream.readBytes(4);
duration = bitstream.readBytes(8);
readed += 28;
} else {
creationTime = createDate(bitstream.readBytes(4));
modificationTime = createDate(bitstream.readBytes(4));
timeScale = (int)bitstream.readBytes(4);
duration = bitstream.readBytes(4);
readed += 16;
}
int qt_preferredRate = (int)bitstream.readBytes(4);
int qt_preferredVolume = (int)bitstream.readBytes(2);
bitstream.skipBytes(10);
long qt_matrixA = bitstream.readBytes(4);
long qt_matrixB = bitstream.readBytes(4);
long qt_matrixU = bitstream.readBytes(4);
long qt_matrixC = bitstream.readBytes(4);
long qt_matrixD = bitstream.readBytes(4);
long qt_matrixV = bitstream.readBytes(4);
long qt_matrixX = bitstream.readBytes(4);
long qt_matrixY = bitstream.readBytes(4);
long qt_matrixW = bitstream.readBytes(4);
long qt_previewTime = bitstream.readBytes(4);
long qt_previewDuration = bitstream.readBytes(4);
long qt_posterTime = bitstream.readBytes(4);
long qt_selectionTime = bitstream.readBytes(4);
long qt_selectionDuration = bitstream.readBytes(4);
long qt_currentTime = bitstream.readBytes(4);
long nextTrackID = bitstream.readBytes(4);
readed += 80;
return readed;
}
在旁注中,我使用这些值来计算播放时间和 fps,如下所示:
double fps = (videoSampleCount * timeScale) / (double) duration;
double videoTime = ((double) duration / (double) timeScale);
videoSampleCount 变量来自“stsz”原子。
据我所知-“mp4”容器源自 QuickTime 原子结构。您可以阅读 QuickTime 文件格式的描述。
解析 quicktime 原子并不是什么大问题(查看atomicParsley 项目)。我不确定 MP4,但至于 MOV 文件 - 在“mvhd”(电影头)原子和“tkhd”(轨道头)原子中有一个“持续时间”字段。这个持续时间通常是帧数乘以“时间尺度”属性。时间尺度可以在相同的原子中找到。
基本上 MP4 结构是一棵树。宏观领域是:
- ftyp - 文件类型
- moov - 包含元数据(歌曲标题、作者、网址和其他信息)
- free - 用于分隔标题和数据的空白区域
- mdat - 包含音频帧
你可以试试这个免费的 MP4 Analyzer 工具
http://www.thinmultimedia.co.kr/products/MP4Reader_download.html
电影的持续时间在电影标题 mvhd 中。以秒为单位的持续时间来自 mvhd 中的两个字段。
- 4 字节时间刻度
- 4 字节持续时间
这些是@Tom Brito 发布的规范中的第 380 和 382 行。
所以给定时间尺度'ts'和持续时间'dur'
Duration in seconds = dur / ts
使用 MP4Parser http://code.google.com/p/mp4parser/之前的海报提到 - 他们甚至有一个提供持续时间的样本:
可以使用媒体框查看器。它是 MP4 和 Quicktime 解析器。打开 Quicktime 文件时,可以看到原子结构。寻找视频描述原子。它的属性之一是持续时间。Media Box Viewer 可以从www.jdxsoftware.org下载。