0

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

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

我一直在阅读并查看 BmffViewer 以及 BmffViewer 的源代码,但是如何找到偏移量仍然让我感到困惑。

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

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

这是来自 MediaInfo 的图片:

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

谢谢

4

1 回答 1

6

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

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

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

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

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

于 2013-09-20T08:54:50.090 回答