【问题标题】:How to serve mp4 streaming video on Google App Engine Blobstore如何在 Google App Engine Blobstore 上提供 mp4 流媒体视频
【发布时间】:2015-01-21 17:41:26
【问题描述】:

我正在使用 GAE 提供大文件,我可以使用简单的blobstoreService.serve(key, res); 成功提供 mp3 如果我将资源 url 放在浏览器中,媒体控件将出现和/或媒体播放器将启动,并且音乐将在下载完成之前开始播放。

但是,当我在 Chrome 中放置一个 mp4 url​​ 时,控件出现但没有任何反应。以下是我所做的:

  1. 没有内容处理以避免下载。如果我把内容配置,那么浏览器会下载视频。
  2. 我什至使用 ffmpeg 转换视频并将 -movflags 快速启动选项放在那里,但没有区别。
  3. 我还将第一个请求的响应标头设置为Accept-Ranges:bytes,我观察到下一个请求仍然要求完整的 75MB 范围。即使浏览器要求全部提供,我是否应该只提供部分服务?
  4. 或者如何让浏览器知道我想逐个提供服务,以便请求具有范围。内容长度是否必要?我应该处理 HEAD 请求吗?我相信现在我的 servlet 只处理 GET。
  5. 我的网址是http://www.somesite.com/serve?folder=aa&file=ok.MP4,Chrome 控制台显示只下载了 1MB,然后就停止了
  6. 除了我的 GAE url 是 src 之外,html 代码如下所示。示例 mp4 有效,但如果我的 gae 链接在那里,它根本不显示视频。

问题

在 GAE 服务器端究竟需要做什么才能使用流媒体服务提供视频?

回答

标记的答案包含有关如何提供 mp4 文件的足够信息,它还提供了一个用于演示的实时网页。从那个演示中,我可以看出,只要 Chrome 浏览器可以解码,我的网站就可以提供 mp4 文件。我遇到的问题是由于 ffmpeg 中使用的编解码器无法被 Chrome 识别。改成 H.264,一切正常。

这里是ffmpeg命令行的一个例子,其中OK.MTS是摄像机文件,output1.mp4是要上传的:

ffmpeg -i ok.MTS -codec:v libx264 -profile:v baseline -preset slow -b:v 500k -maxrate 800k -bufsize 1000k -vf scale=-1:432 -threads 0 -b:a 96k output1.mp4

【问题讨论】:

    标签: java google-app-engine video-streaming mp4 blobstore


    【解决方案1】:

    您的处理程序是否将正确的 Content-Type 放入响应标头中?您需要设置“Content-Type:video/mp4”才能正确播放视频。

    Here 是我在 App Engine 上编写的一个测试站点,可以播放来自 Cloud Storage 和 BlobStore 的 mp3、ogg 和 mp4 文件。

    Here 是 BlobStore 中一个 mp4 文件的链接,它使用 serve() 返回文件。当我将此链接粘贴到 chrome 中时,内容会正确播放。

    【讨论】:

    • 感谢您的网站。有点奇怪。我的有所有类似的响应,除了 Chrome 只下载 1MB 并停止。另一个文件在 1.1M 处停止。
    • 我注意到的一件事是,虽然我明确尝试设置内容长度,但标头没有。
    • 我认为我们不允许您在使用 serve() 时设置该标头,因为响应是分块的。
    • 感谢您提供此信息。如果只使用 bsService.serve(key, res),那么 blob 服务如何查看范围?我使用 Chrome,我可以看到响应范围与请求范围相匹配,尽管块在几 MB 后停止。也许我的文件太大了? 75MB 太大了吗?
    • 请阅读文档,它特别提到了如何提供范围:cloud.google.com/appengine/docs/java/blobstore/…
    猜你喜欢
    • 1970-01-01
    • 2011-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-09
    • 2015-02-07
    • 2013-12-25
    相关资源
    最近更新 更多