2

在我的 Java Web 应用程序中,我需要向未经身份验证的用户显示存储在 Google Drive 帐户中的视频。

我设法在服务器应用程序中使用来自 Google API 的 OAuth2 来检索访问令牌和视频文件的 DownloadUrl 属性来解决这个问题。然后以这种方式将访问令牌添加到 URL:

https://doc-10-8g-docs.googleusercontent.com/...&access_token=XXXXXXXX

我将此 URL 传递给前端应用程序,无论是 HTML5 视频播放器还是 Flash 视频播放器,它都能正常工作。

但我想知道是否可以以类似的方式使用 Google Drive 视频播放器,原因如下:

  • 是直播。您无需等待缓冲即可获取视频的任何部分
  • 支持更多视频格式(MKV、divx等)
  • 视频质量选择器

我尝试以类似的方式使用 Drive API 中的 EmbedLink 和 access_token 参数,但它不起作用。

替代解决方案可能是在 Flash/HTML5 播放器中播放真正的流媒体。这对于我的目的应该足够了。

4

1 回答 1

1

通过查看 Google Drive 嵌入播放器的请求,我自己找到了解决方案。

基本上你会请求这个地址:

https://docs.google.com/get_video_info?authuser=&docid=<YOUR_VIDEO_ID>

您可以在 OAuth 身份验证后使用 Drive 客户端执行此操作,或附加&access_token=YOUR_TOKEN在 URL 的末尾。两种选择都有效。

响应包含 URL 编码的字段和值对,以及有关视频的信息。我们的 porpuse 的有趣字段是fmt_stream_map,它包含各种格式和编解码器的可用流列表。这些 URL 可以发送到 Flash 或 HTML5 播放器,无需验证即可复制。

如果您想在任何特定时刻开始播放视频,只需&begin=MILLISECONDS在流 URL 的末尾添加即可。

注意:您可以从字段中获取 URL 列表url_encoded_fmt_stream_map。它有点难以解析,但包含其他有用的信息,如视频 mime 类型和编解码器。

示例代码:

Credential credential = getOAuth2Credential(); //Your authentication stuff

//Create a new authorized API client
Drive service = new Drive.Builder(new NetHttpTransport(), new JacksonFactory(), credential).build();

String fileId = "XXXXXXXXXXX"; //Your video docid in Google Drive

HttpResponse resp = service.getRequestFactory()
        .buildGetRequest(new GenericUrl("https://docs.google.com/get_video_info?authuser=&docid=" + fileId)).execute();

//Convert response InputStream to String
String content = "";
InputStreamReader isr = new InputStreamReader(resp.getContent());
int ch = 0;
while (ch != -1) {
    ch = isr.read();
    if (ch != -1) content += (char)ch;  
}

//Split response in pairs field / value
StringTokenizer st = new StringTokenizer(content, "&");

while (st.hasMoreTokens()) {
    String token = st.nextToken();
    if (token.split("=").length == 2) {
        String field = token.split("=")[0];
        String value = URLDecoder.decode(token.split("=")[1], "UTF-8");
        if ("url_encoded_fmt_stream_map".equals(field)) {
            //Prints info of each available video Stream
            String[] urlList = value.split(",");
            for (int i=0; i < urlList.length; i++) {
                System.out.println("Stream #" + i + ":");
                System.out.println("URL: " + URLDecoder.decode(urlList[i].split("&")[1].split("=")[1], "UTF-8"));
                System.out.println("Quality: " + URLDecoder.decode(urlList[i].split("&")[3].split("=")[1], "UTF-8"));
                String type = URLDecoder.decode(urlList[i].split("&")[2], "UTF-8");
                if (type.indexOf(';') > 0) {
                    System.out.println("Mime type: " + type.substring(5, type.indexOf(';')));
                    System.out.println("Codecs: " + type.substring(type.indexOf("codecs=\"") + 8, type.lastIndexOf('"')));
                }
                else {
                    System.out.println("Mime type: " + type.substring(5));
                }
            }
        }
    }
}
于 2013-04-18T13:08:59.980 回答