使用HTML5视频标签从Google Drive流式传输视频

7

我正在尝试从Google Drive流传一个200MB的视频文件。我已经尝试过嵌入一个24MB的公共共享文件,并且这个方法可行:

<video controls>
    <source src="https://drive.google.com/uc?export=download&id=0B0gf7RQXoPVEa0xCSEhiRG5GNHM" type="video/mp4">
    Oops. HTML 5 video not supported.
</video>

当我在浏览器中正常访问该网址时,会显示一个安全请求,我必须接受。我认为这是问题的原因,因为它阻止了下载。也许我在URL中缺少一些参数?如何在不被Google Drive阻止请求的情况下流传输更大的文件?


我不认为你可以直接这样做,但是有一些像https://www-drv.com这样的服务可以作为代理,并允许您暴露Google Drive或OneDrive的内容。 - Offbeatmammal
谢谢!这个可行,这是一个学校项目,所以这是一个完美的解决方案... - Ilario Engler
很酷,我会将其作为答案添加,以便其他人看到。 - Offbeatmammal
2个回答

26
上面你使用的方法仅适用于小于100MB的文件。实际上,无论大小,您都可以使用HTML 5视频标签来流式传输Google Drive视频。我花了一段时间才弄清楚,所以在这里是:

  • 获取您的视频的共享链接。这可以通过右键单击Google Drive中的视频并单击获取可共享链接按钮来完成。将此链接复制到剪贴板中。

  • 使用共享链接查看视频。只需将从上一步获得的链接粘贴到您的Web浏览器中。请在接下来的几个步骤中使用Firefox或Chrome。

  • 选择所需的质量。使用Google Drive播放器,并选择您想要的质量,如1080p或720p。单击播放以确保质量已更改。

  • 获取视频的绝对路径。这是有趣的部分:右键单击视频播放器,您将看到带有循环和stats for nerds等选项的内置菜单。再次右键单击,您将看到浏览器内置菜单,其中包含复制视频地址或保存视频等选项。选择复制视频地址并进行测试,将其粘贴到新选项卡中,查看视频是否播放。

  • 将链接插入您的视频标签中。这是最令人满意的部分:

  <video width="1280" height="720" controls>
      <source src="link from Google Drive" type="video/mp4" />
  </video>

您可以使用开发者工具中的网络检查工具。这些工具可以通过右键单击网页并选择“检查元素”,然后点击网络选项卡,或使用内置浏览器菜单来访问。您可能需要刷新页面并开始播放视频,然后才能在网络选项卡中找到它。通常,它被归类为媒体文件,因此您可以过滤掉与媒体文件相关的每个请求。从那里开始,您将看到视频链接并能够复制它们。

重要的是要意识到每个URL实际上与客户端的IP地址相关联。这意味着您得到的链接不一定适用于其他人的设备。为了解决这个问题,您可以为客户端预加载获取链接的页面,然后获取源代码并搜索以fmt_map_stream开头的JSON数组。在那里,您将获得四个转义链接,分别为360p480p720p1080p。复制这些链接并在您的视频标记中使用它们。请记住,此过程应该从服务器端进行。

此外,我建议使用Google相册。Google相册允许免费存储,没有限制,只要您允许Photos压缩视频,以便它们不会使用Google Drive上的配额。要开始,请先上传任意大小的视频文件,然后按照以下步骤进行操作:

  • 创建一个新相册。根据需要命名,然后拖动视频或选择已经上传的现有内容。

  • 选择共享选项。在右上方,有一个共享按钮。选择该按钮将允许您获取相册的可共享链接。关键是确保只有您可以向此相册添加视频。请确保在生成可共享链接之前执行此操作。

  • 获取单个视频的可共享链接。这很简单:右键单击视频并复制地址。您应该获得以下格式: https://photos.google.com/share/SomeId/photo/SomeOtherId?key=AKey

  • 从服务器端获取下载链接。以下示例是一个C#示例,从上述任何链接中提取下载链接:

  var source = "";

  using (var webClient = new WebClient())
  {
      source = webClient.DownloadString(link_from_above);
  }

  var chunks = source.Split(',');
  var downloadLink = "";

  foreach (var chunk in chunks)
  {
      if (chunk.Contains("video-downloads.googleusercontent.com"))
      {
          downloadLink = chunk.Replace("\"", string.Empty);

          Process.Start("iexplore.exe", downloadLink);
      }
  }
上面的代码简单地从之前获取的链接下载源代码。然后,它被逗号分隔,因为包含video-downloads.googleusercontent.com的任何块都被提取并替换所有的"。在这个例子中,启动了Internet Explorer并解析该链接。结果将是Internet Explorer要求您保存视频。从这里,您可以执行以下操作:
<video width="1280" height="720" controls>
    <source src="download link from source" type="video/mp4" />
</video>

然后您就能够进行流式传输。您也可以使用VLC进行流式传输。唯一的缺点是因为文件在被下载和播放时实际上是同时进行的,所以寻找不总是有效的。这种方法比Google Drive更容易。

替代方案

Google Drive API允许您从Web应用程序的服务器端甚至通过命令行和桌面应用程序上传和下载到您的Google Drive。有Python和.NET支持,并且有关如何设置项目的广泛文档。

  • 启用Google Drive API。 确保您已登录要从中流式传输文件的Google帐户。您可以访问 链接以启用Google Drive API。
  • 获取API密钥。 通过访问 链接,您可以生成API密钥以访问Google Drive。您可能会提示创建一个新项目。
  • 获取文件ID。 访问Google Drive并查找要流式传输的文件。确保它对公众可用。在新标签中打开它并复制文件ID。它应该像这样:https://drive.google.com/file/d/<YOUR_FILE_ID>/view
  • 调用下载链接。 您的下载链接应该采用这种格式:

https://www.googleapis.com/drive/v3/files/<YOUR_FILE_ID>?key=<YOUR_API_KEY>&alt=media

这是使用200MB文件进行测试的。下载完美地运行,没有任何病毒扫描干扰它。使用上述链接并将其添加到站点的嵌入代码中。

另一个替代方案

您可以使用M3U8文件来传递内容。您可以使用FFmpeg或任何类似实用程序将视频文件分成较小的片段。确保每个片段小于100MB。将段上传到Google Drive并获取其可共享的链接。然后,您可以将链接更改为它们的可下载变体,如下所示:

https://drive.google.com/uc?id=[segment_id]

通过将链接更改为Google Drive下载链接来更改您的M3U8文件。然后,您可以像这样将M3U8文件嵌入到Web页面中:

<video width="500" height="400" controls>
    <source src="video.m3u8" type="application/x-mpegURL">
</video>

然而,这种方法并非总是有效的。为了克服这个问题,您可以创建一个 Web 服务,将下载流直接提供给用户,如下所示:

[ApiController]
[Route("[controller]")]
public class SegmentController : ControllerBase
{
    private static HttpClient Client { get; } = new HttpClient();

    [HttpGet]
    public async Task<FileStreamResult> Get(string id)
    {
        return new FileStreamResult(await Client.GetStreamAsync("https://drive.google.com/uc?id=" + id), new MediaTypeHeaderValue("video/MP2T"))
        {
            FileDownloadName = id + ".ts" // or + ".m2ts", depending on your media
        };
    }
}

然后,您可以调用此GET请求/segment?id=[GOOGLE_DRIVE_ID]。该方法将基本返回直接下载流到客户端,带有适当的标头,使视频播放器正确地流式传输播放列表。请记住,上面的示例适用于.NET Core。

有很多关于如何从现有视频剪辑制作M3U8文件的教程。我建议使用FFmpeg,因为它非常简单,可以创建这些文件。M3U8的Apple指南在这里提供。如果您不是直播,则需要一个VOD(按需视频)播放列表。对于大型视频,推荐使用此方法。如果您不想压缩大型视频,则将其拆分并以小片段交付将对您有所帮助,并且您可以使用Google Drive来托管这些片段(您需要将自己的视频重新混合成.ts.m2ts以拆分并避免重新编码)。这也是寻求和缓冲的绝佳解决方案,因为像上面的直接下载解决方案可能不允许您查找,而且链接也会过期。YouTube使用类似的设置向客户端传送视频。


1
你好,你知道如何从服务器端完成这个吗? - B''H Bi'ezras -- Boruch Hashem
1
优秀的解决方案。谢谢。 - Stuart Clarke
1
@AhmedAbuthwabah 我尝试了一个示例播放列表。VLC拒绝流式传输,但DVDFab和MPlayer似乎可以流式传输视频播放列表。在Firefox中似乎存在相同的问题。您可能需要创建一个服务,将其重定向到Google下载链接作为流。不确定您在Web应用程序中使用什么,我将编辑我的答案,并提供一些代码示例来解决此问题。 - Razor
1
@AhmedAbuthwabah 我已经更新了问题,并提供了一个.NET Core的示例。我不确定这是否是您正在使用的技术,我对PHP或其他ASP.NET以外的技术了解不足。希望这可以帮到您。 - Razor
1
嘿@bimmui,很抱歉我对Python/Django的实现不确定,我主要使用C#进行.NET的开发。但是,我可以解释一下正在发生的事情,也许这可以帮助您实现它。WebClient部分只是从Google Photos URL下载HTML源代码。也许搜索Python实现以从web URL下载HTML源代码?字符串的拆分应该很容易在Python中实现,以及替换双引号。您可以忽略Process.Start调用,那只是为了测试下载链接。 - Razor
显示剩余22条评论

4
我认为你不能直接这样做,但是有一些像www-drv.com这样的服务可以作为代理,让你暴露Google Drive或OneDrive的内容。
我对他们的服务有些担忧,因为FAQ不太清楚他们需要多少访问GDrive/OneDrive的权限,不清楚是否必须从根目录下访问(这对我来说是不可行的),还是可以选择单个目录(和子目录)。我曾经给他们发过电子邮件询问澄清,但没有回复......只是想提醒一下。

我创建了一个次要账户,没有其他东西存储在谷歌云盘上。我永远不会相信这样的服务。 - Ilario Engler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接