3

语境

我的应用程序允许用户使用 createUploadUrl() 模式通过 Google App Engine 将 .mp4 文件上传到 Google Cloud Storage。上传工作正常,我能够在处理程序中获取相应的 FileInfo 对象。我正在使用适用于 Java 的 App Engine SDK 1.8.2。

挑战

我需要从 .mp4 文件中获取“持续时间”属性并将其存储在我的数据库中,但 FileInfo 对象不提供对此元数据的访问。我对如何执行此操作有一些想法(我已在下面列出),但考虑到我正在处理的项目有几个遗留依赖项,这些想法都不是很简单。

我很想听听你对如何解决这个问题的任何想法或建议(如果你有任何成功的故事,最好是!)

想法

  1. 我知道有像 ffmpeg 和 mdls(对于 mac)这样的脚本和实用程序可以从文件中读取元数据,但我的理解是这些将无法在 Google App Engine 中运行,我需要启动单独的进程使用类似谷歌计算引擎的东西。
  2. 我可以创建一个自定义 Flash 上传控件,当用户选择要上传的文件并通过标准表单提交将其传递时,它会读取持续时间逻辑。
  3. 我还知道有一个 Google Cloud Storage JSON API 现在处于 Beta 阶段。我没有看到任何可以让我从 .mp4 文件中读取“持续时间”属性的功能,但我可能会遗漏一些东西......

代码

HTML 表单

<form name="myForm" id="myForm" action="<%=createUploadUrl("/upload, uploadOptions)%>" method="POST" enctype="multipart/form-data">
    <input type="file" name="uploadFileControl" id="uploadFileControl" value="Select...">
    <input type="submit" value="Submit">
</form>

服务器端处理程序

DAO dao = new DAO();
BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService();
Map<String, List<FileInfo>> fileInfos = blobstoreService.getFileInfos(req);
List<FileInfo> uploadedFile = fileInfos.get("uploadFileControl");

if(uploadedFile != null) {
    FileInfo file = uploadedFile.get(0);
    String fileName = file.getFilename();
}
4

3 回答 3

2

Google Cloud Storage 与内容类型无关,也就是说,它以相同的方式处理任何类型的内容(视频、音乐、zip 文件、文档,随你便)。它也不会解析或“读取”上传的内容(无论如何都是在 REST 上加密的)。因此,Google Cloud Storage 不可能知道给定文件格式(如 mp4)的细节,因此您不会在 API 中找到任何此类功能。我假设 AppEngine 及其 FileInfo 对象也是如此。

于 2013-09-10T23:54:47.327 回答
0

你可以用谷歌搜索“python mp4 parser”,看看有没有什么问题......

于 2013-09-11T01:10:34.703 回答
0

发回我最终使用的解决方案。

我使用了一个名为 mediaelement.js ( http://mediaelementjs.com/ )的视频播放器插件来加载从 GCS 上传的文件。视频播放器有一个“持续时间”属性,每次加载新视频文件时都会更新,这使得整个事情变得非常简单。

我正在研究的另外两个选项涉及 1) 使用名为 mp4parser ( https://code.google.com/p/mp4parser/ ) 的 java 实用程序将上传的文件从 Google Cloud Storage 加载到 GAE 并手动提取持续时间元数据2) 更新名为 Plupload ( http://plupload.com/ )的开源上传实用程序,以在文件上传时提取持续时间元数据。

希望这可以帮助遇到类似问题的其他人!

于 2013-10-08T21:35:31.070 回答