【问题标题】:How to find byte-offset in .mp4-file from timecode or framenumber?如何从时间码或帧号中找到 .mp4 文件中的字节偏移量?
【发布时间】:2013-09-20 08:43:39
【问题描述】:

我正在分块读取 .mp4 文件并通过网络将它们提供给客户端/播放器。

如果客户端跳到它尚未收到的视频部分,它会将时间或帧#发送回服务器,我想从文件的那部分开始读取。

我已经阅读了很多内容并查看了 BmffViewer,以及 BmffViewer 的源代码,但我仍然不知道如何找到偏移量。

文件的内容都将采用相同的格式(h.264 vid、aac 声音)。 mdat 位于文件的末尾,但它们似乎仍会立即开始播放。

这是来自 BmffViewer 的 ftyp 和文件结构的图片:

这是来自 MediaInfo 的图片:

谁能提供一些示例代码或至少为我指明正确的方向?现在开始阅读 ISO 规范还为时过早...

谢谢

【问题讨论】:

    标签: c# mp4 h.264 offset aac


    【解决方案1】:

    您可能知道,isom 文件是由原子构建的。通常这些都是构建的

    length (4 bytes), type (4 bytes), *body*
    

    要获取有关编码流的信息,您需要解析包含所需信息的原子。对于帧信息,您将不得不关注 stbl。可以在 quicktime 格式中找到一个很棒的(更短的)介绍。 isom 格式有一些变化,但一般的东西(如帧信息)是相同的,并且可以免费获得。更多信息在这里:quicktime file format

    简短说明:stbl 包含所有样本信息。样本按块分组并存储在 mdat 中。一个块可以是一个样本,但它也可以是一组样本(在 stsc 中定义)。每个块都有一个关于文件开始的偏移量(在 stco 中定义),每个样本都有一个大小(在 stsz 中定义)。对于示例时间戳,您可以使用示例持续时间(在 stts 中定义)。要知道哪些样本是关键帧,您可以使用 stss 列出作为关键样本的样本数。

    所以如果你把这一切放在一起:如果你有一个帧号并且想要找到偏移量,请查看 stsc 以找到您需要的块,查看 stco 以找到该块的偏移量并添加在您需要的样本之前的样本的 stsz 中找到的尺寸。

    【讨论】:

    • 感谢您提供了非常好的和描述性的答案,它使它们如何组合在一起更加清晰。我在查看如何以编程方式从框中提取所需信息时遇到了麻烦,但是在查看了更多 Bmff 代码之后,我想我可以按照您的最后一段并查看 Bmff 代码将其拼凑起来。再次感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多