pascal - 读取 MPEG-2 时间码

标签 pascal mpeg-2 timecodes

我使用一些多年前的旧代码来计算 MPEG-2 视频的持续时间。似乎有些事情发生了变化,因为我的 49 秒视频变成了 1 小时 49 秒。

在文件中找到最后一个 GOP 头,并提取出 4 字节时间码“040E2AC0”。在 32 位长字中,以小端字节序读取为 3223981572。

然后使用汇编器函数 bswap eax 交换字节序。结果是 68037312。然后一些 Pascal 代码会像这样提取持续时间...

Hours   := (TimeCode shr 26) and $1F;
Minutes := (TimeCode shr 20) and $3F;
Seconds := (TimeCode shr 13) and $3F;

小时为 1,但应为 0。分钟正确为 0。秒正确为 49。

我不擅长通过位操作来调试问题。这有什么问题吗?如果有帮助的话,我可以安排一个视频链接。

非常感谢, 罗斯。

最佳答案

发布您的文件是个好主意。

如果您查看文件中的第一个 GOP,它的字节值为 04 08 00 40 (最后一个 GOP 的字节值为 04 0E 2A C0 正如您所说)

当第一个 GOP 通过您的程序运行时,结果是 01:00:00,即 1 小时。

我没有找到任何相关规范,但显然长度是第一个和最后一个 GOP 之间的差异

关于pascal - 读取 MPEG-2 时间码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38112928/

相关文章:

inno-setup - 在 Inno Setup 中使用 {AppVersion} 作为函数的参数

pascal - pascal 类使用时出现 SIGSEGV 错误

FFmpeg 视频第一帧时间码值

ffmpeg - 如何在安装 Video-ffmpeg 时摆脱 'avformat.h' no such file or directory 错误?

python-2.7 - 使用设置的开始时间码将时间码转换为帧

c - 如何使用struct将Pascal风格的字符串转换为C类型

Pascal:Const 数组

用于解码 MPEG2 视频流的 Android MediaCodec 使用

c++ - 如何确定 mpeg-2 程序流文件的视频尺寸

h.264 - Mpeg2 PES 解复用器 : how to extract PES packets with H. 264 视频流?