从GAE上传到Google Cloud Storage后计算mp4视频的长度

时间:2013-09-10 23:08:29

标签: java python google-app-engine mp4 google-cloud-storage

上下文

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

挑战

我需要从.mp4文件中获取“duration”属性并将其存储在我的数据库中,但FileInfo对象不提供对此元数据的访问。我对如何做到这一点有了一些想法(我已在下面列出),但由于我正在开发的项目有几个遗留依赖项,因此没有一个是非常简单的。

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

  1. 我知道有一些脚本和实用程序,比如ffmpeg和mdls(对于mac)可以读取文件中的元数据,但我的理解是这些将无法在Google App Engine中运行,我需要踢使用Google Compute Engine等单独的流程。
  2. 我可以创建一个自定义Flash上​​传控件,当用户选择要上传的文件并通过标准表单提交传入时,它会读取持续时间逻辑。
  3. 我也知道现在有一个处于Beta阶段的Google Cloud Storage JSON API。我没有看到任何允许我从.mp4文件中读取“duration”属性的功能,但我可能会遗漏某些内容......
  4. 代码

    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();
    }
    

3 个答案:

答案 0 :(得分:1)

Google云端存储是内容类型无关的,即它以相同的方式处理任何类型的内容(视频,音乐,zip文件,文档,您的名字)。它也不解析或“读取”上传的内容(无论如何都在REST加密)。由于Google云端存储无法了解mp4等特定文件格式的细节,因此您无法在API中找到任何此类功能。我假设AppEngine及其FileInfo对象具有相同的保留。

答案 1 :(得分:0)

你可以谷歌“python mp4解析器”,看看是否有任何问题......

答案 2 :(得分: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/),用于在文件上载时提取持续时间元数据。

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