如何在时间码或帧号中找到.mp4文件中的字节偏移量?

时间:2013-09-20 08:43:40

标签: c# mp4 h.264 offset aac

我正在以块的形式阅读.mp4文件,并通过网络将其提供给客户端/播放器。

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

我一直在阅读BmffViewer,以及BmffViewer的来源,但是如何找到偏移量仍然让我感到不安。

文件内容全部采用相同格式(h.264 vid,aac sound)。 mdat位于文件的最后,但它们似乎仍然可以立即开始播放。

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

这是来自MediaInfo的照片:

任何人都可以提供一些示例代码或者至少指出我正确的方向吗?现在开始阅读ISO规范还为时过早......

由于

1 个答案:

答案 0 :(得分:4)

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

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

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

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

因此,如果您将所有这些结合在一起:如果您有一个帧号并想要找到偏移量,请查看stsc以找到您需要的块,查看stco以找到该块的偏移量并添加在您需要的样品之前的样品中,在stsz中找到的尺寸。