【问题标题】:Retrieve specific chunk file from MongoDB gridfs从 MongoDB gridfs 中检索特定的块文件
【发布时间】:2017-12-31 21:21:21
【问题描述】:

我已使用块大小为 15MB 的 php 脚本将 1.5GB 视频文件存储到 MongoDB GridFS。

我可以使用文件名检索完整的视频文件。但我想跳过块文件并仅检索视频的特定部分。

是否可以跳过和检索特定的块文件?

谢谢, 哈里。

【问题讨论】:

  • 可能吗?是的。之所以如此,是因为 GridFS 只是应用于驱动程序的“软件”。从数据库的角度来看,每个“块”实际上只是“集合”中的一个“文档”,就像您在 MongoDB 中所做的一切一样。然而,这里可能存在更广泛的问题,正如这里的答案中提出的一些好的建议所暗示的那样。

标签: php mongodb gridfs


【解决方案1】:

虽然您的要求乍看起来很简单,但我相信它的实现比看起来要复杂得多,因为如果我理解正确的话,您想要构建的本质上是一个视频流系统。

GridFS 不知道您存储的内容。它主要是一种约定,使您能够在 MongoDB 中存储大于 16 MB 的文档(大于最大 BSON 大小)。

GridFS 通过将输入文件拆分为“块”来实现这一点,但由应用程序来理解块中的数据。

如果您需要通过检索特定块范围来获取视频的特定部分,则需要考虑一些事项:

  • 视频经常使用可变速率编码 (VBR) 进行压缩,这意味着一个 15 MB 块可以包含不同分钟的视频(例如,一个块中可能是 15 分钟,另一个块中可能是 12 分钟,等等)。
  • 视频文件通常包含元数据部分(例如标题、概要等)。您需要识别此元数据部分并将它们与实际视频数据包分开。大多数情况下,此元数据大小与视频数据包大小不同。
  • 您想要的“搜索”有多精细。例如,如果您需要 1 秒的搜索粒度,则需要计算 1 秒视频中包含多少数据。如果您使用的是恒定比特率编码 (CBR),则计算起来会稍微容易一些。

因此,要达到您的要求,您需要:

  1. 使用恒定比特率 (CBR) 对视频进行编码。
  2. 能够剖析视频格式,以便能够将一个视频包准确地存储在一个块中。
  3. 将视频元数据存储在其他位置。

基本上,这意味着您还需要构建能够理解此存储方案的播放器,以便能够可靠地“寻找”视频中的某个点。

【讨论】:

  • 嗨,凯文,只是一个问题。我们正在压缩视频并存储它。我们认为 CBR 不适用于压缩视频。有没有办法在压缩视频中做同样的事情。
  • @Hari 你的意思是你使用通用压缩算法压缩视频,例如压缩包/rar?原始视频格式是什么?
  • 视频格式为.mp4,我们使用codec(H264)压缩方式。
  • @Hari 我需要澄清一些事情:1)H264 已经高度压缩。用 zip/rar/etc 压缩它不会有太大的收获。 2)如果你这样做了,你添加了一个复杂层,除了使视频难以播放之外,它什么也没做。 3) mp4 是一种容器格式。视频、音频、字幕等内容使用各自的方案单独压缩(例如视频为 H264,音频为 AAC)。 mp4 可以同步所有这些压缩流并一起播放。
  • 谢谢凯文。我们只做 H264 压缩而不是 zip/rar/etc。谢谢你的信息。
猜你喜欢
  • 2016-01-01
  • 1970-01-01
  • 2014-12-05
  • 2020-10-23
  • 1970-01-01
  • 1970-01-01
  • 2015-07-21
  • 1970-01-01
  • 2013-01-02
相关资源
最近更新 更多