我一直在用C#编写一个读取.mov
文件的程序。我能够解析整个事情,忽略我不理解的块,并从我做的块中获取相关信息。
我想做的是从文件中获取 FPS,但获取它并不简单。我假设是因为该格式可以以不同的速率存储许多电影。
如果有人能指出我正确的方向,比如我应该看哪些块(原子(?我以为是stts
,但并非所有.mov
文件都包含该块!
我错了。stts 原子始终在那里,这就是您获得计算 FPS 的信息的地方。以下代码尚未经过彻底测试,但它确实适用于我拥有的所有.mov文件。
void ReadSTTS(BinaryReader reader)
{
int versionAndFlags = reader.ReadInt32(true);
int nEntries = reader.ReadInt32(true);
int sampleCount = 0;
int sampleDuration = 0;
for (int i = 0; i < nEntries; i++)
{
sampleCount += reader.ReadInt32(true);
sampleDuration += reader.ReadInt32(true);
}
FPS = (float)Math.Round((float)mediaTimeScale / ((float)mediaDuration / (float)sampleCount), 2);
}
mediaTimeScale 和 mediaDuration 都来自 mvhd atom。ReadInt32(true(是一个改变字节序的扩展,因为我正在Windows机器上读取.mov。