1

我试图将 30 秒的用户 mp3 录音作为 Blob 存储在我的应用引擎数据存储中。但是,为了启用此功能(App Engine 每次上传有 1MB 的限制)并降低成本,我想在上传之前压缩文件并在每次请求文件时解压缩文件。你会如何建议我完成这个(它可以通过任务队列在后台发生,但有效的解决方案总是好的)

根据我自己的测试和研究 - 我看到了两种可能的方法来实现这一点

  • 兹库

为此,我需要使用 While 循环一次压缩一定数量的块。但是,App Engine 不允许您写入文件系统。我考虑过使用临时文件来完成此操作,但是在尝试从临时文件中解压缩内容时,我对这种方法没有运气

  • 压缩包

从网上阅读来看,应用引擎 url 获取功能似乎已经请求了 gzip 压缩的内容,然后将其解压缩。有没有办法阻止函数解压缩内容,以便我可以将其以 gzip 格式放入数据存储区,然后在需要将其回放给用户时解压缩?

让我知道您将如何建议使用 zlib 或 gzip 或其他一些解决方案来完成此操作。谢谢

4

5 回答 5

2

“上传前压缩”意味着在用户的浏览器中进行 - 但您的问题中没有任何文字解决这个问题!这似乎与您的 GAE 应用程序中的压缩有关,当然数据只会上传后出现。如果您可以开发这些扩展并说服您的用户安装它们,您可以使用 Firefox 扩展(或其他浏览器的等价物)来做到这一点,但这与 GAE 无关!-)更不用说,正如@RageZ 的评论提到,MP3本质上已经被压缩了,所以几乎没有或没有任何收获(尽管也许你可以再次为用户使用浏览器扩展,降低MP3的比特率,从而降低文件的尺寸,这可能会影响音频质量,

所以,总的来说,我必须支持@jldupont 的建议(也在评论中)——使用不同的服务器来存储大文件(S3,亚马逊的产品,虽然不是唯一的,但肯定是一种可能性)。

于 2009-11-16T01:23:50.343 回答
2

虽然通过标准压缩或以较低比特率重新编码压缩 MP3 文件的技术限制(在其他答案中提到)是正确的,但您的目标是存储30 秒的 MP3 编码数据。假设您可以对您的用户强制执行此操作,如果 MP3 比特率为 256kbit 恒定比特率 (CBR) 或更低,则无需应用额外的压缩技术就可以了。在 256kbit CBR 下,30 秒的音频需要:

(((256 * 1000) / 8) * 30) / 1048576 = 0.91MB

最大标准比特率为 320kbit,相当于 1.14MB,因此您必须使用 256 或更少。最常用的比特率是 128kbits。

还有一些额外的开销会增加最终文件的大小,例如 ID3 标签和框架,但你应该没问题。如果没有,请降至 224kbits 作为您的最大值(30 秒 = 0.80MB)。还有其他复杂性,例如可变比特率编码,文件大小不是那么可预测的,我忽略了这些。

所以你的问题不再是如何压缩 MP3 文件,而是如何确保你的用户知道他们不能上传超过 30 秒的 256kbits CBR 编码,以及如何执行该策略。

于 2009-11-16T03:55:14.960 回答
2

您可以尝试新的 Blobstore API,允许存储和提供高达 50MB 的文件

http://www.cloudave.com/link/the-new-google-app-engine-blobstore-api-first-thoughts

http://code.google.com/appengine/docs/python/blobstore/

http://code.google.com/appengine/docs/java/blobstore/

于 2010-01-03T23:20:23.117 回答
0

正如 Aneto 在评论中提到的,您将无法使用 gzip 或 zlib 等标准压缩库来压缩 MP3 数据。但是,您可以使用LAME低得多的比特率重新编码 MP3 。

于 2009-11-16T01:20:39.380 回答
0

您最多可以使用 Blob 列表存储 10Mb。搜索google file service。在我看来,它比 BlobStore 更通用,因为我昨天才开始使用 BlobStore Api,我仍在研究是否可以按字节访问数据.. 就像将 doc 更改为 pdf,将 jpeg 更改为 gif 一样。

您可以存储 1Mb * 10 = 10 Mb 的 Blob(我认为的最大实体大小),或者您可以使用 BlobStore API 并获得相同的 10Mb 或如果启用计费则获得 50Mb(您可以启用它,但如果您没有通过您不支付的免费配额)。

于 2010-01-24T01:37:48.713 回答