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

Ila*_*ler 5 html video html5-video

我正在尝试从 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>
Run Code Online (Sandbox Code Playgroud)

当我在浏览器中正常导航到此 URL 时,会显示一个我必须接受的安全请求。我相信这是问题,因为它阻止了下载。也许我在 URL 中缺少一些参数?如何在没有 Google Drive 阻止请求的情况下流式传输更大的文件?

Raz*_*zor 17

您上面使用的方法仅对 100MB 或更小的文件有效。无论大小如何,您实际上都可以使用 HTML 5 视频标签流式传输 Google Drive 视频。我花了一段时间才弄明白,所以这里是:

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

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

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

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

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

      <video width="1280" height="720" controls>
          <source src="link from Google Drive" type="video/mp4" />
      </video>
    
    Run Code Online (Sandbox Code Playgroud)

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

请务必注意,每个 URL 实际上都与客户端的 IP 相关联。这意味着您获得的链接不一定适用于其他人的设备。为了解决这个问题,您可以预加载从中获取客户端链接的页面,然后获取源并从fmt_map_streamGoogle Drive 源中开始搜索 JSON 数组。在那里,你会得到四个逃脱环节360p480p720p1080p。复制这些链接并在您的视频标签中使用它们。请记住,这个过程应该从服务器端发生。

此外,我建议使用 Google 相册。Google 相册允许无限制的免费存储,因为您允许相册压缩您的视频,这样它们就不会耗尽您在 Google 云端硬盘上的配额。首先,上传任意大小的视频文件。然后,执行以下操作:

  • 创建新相册。相应地命名,然后拖动视频或选择您已经上传的现有内容。

  • 选择共享选项。在右上角,有一个共享按钮。选择这将允许您获得相册的可共享链接。确保只有您可以将视频添加到此相册中,这一点至关重要。确保是上述生成可共享链接的情况。

  • 获取指向单个视频的可共享链接。这很简单:右键单击视频并复制地址。你应该得到这样的格式: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);
          }
      }
    
    Run Code Online (Sandbox Code Playgroud)

上面的代码只是从您之前获得的那个链接下载源代码。然后,它由逗号分隔,因为video-downloads.googleusercontent.com提取包含的任何块并"替换所有块。在此示例中,启动 Internet Explorer 并解析链接。结果是 Internet Explorer 要求您保存视频。从这里,您可以执行以下操作:

<video width="1280" height="720" controls>
    <source src="download link from source" type="video/mp4" />
</video>
Run Code Online (Sandbox Code Playgroud)

然后,您将能够进行流式传输。您还可以从 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]

M3U8通过更改指向 Google Drive 下载链接的链接来更改您的文件。然后,您可以将M3U8文件嵌入到您的网页中,如下所示:

<video width="500" height="400" controls>
    <source src="video.m3u8" type="application/x-mpegURL">
</video>
Run Code Online (Sandbox Code Playgroud)

然而,这种方法可能并不总是有效。为了克服这个问题,您可以创建一个 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
        };
    }
}
Run Code Online (Sandbox Code Playgroud)

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

有很多关于如何M3U8从现有视频剪辑生成文件的教程。我建议FFmpeg创建这些文件非常简单。苹果公司在引导M3U8可用在这里。由于您不是实时流媒体,因此您需要一个 VOD(视频点播)播放列表。大视频推荐使用此方法。如果您不想压缩您的大视频,将它们拆分并分成小片段将有助于您,您可以使用 Google Drive 来托管这些片段(您需要将视频重新混合到.ts.m2ts以便拆分和避免重新编码)。这也是用于搜索和缓冲的绝佳解决方案,因为像上述解决方案这样的直接下载可能不允许您进行搜索并且链接也会过期。YouTube 使用类似的设置向客户端传送视频。


Off*_*mal 4

我认为您不能直接这样做,但有一些服务(例如www-drv.com)可以充当代理并让您公开 Google Drive 或 OneDrive 内容。

我对他们的服务有一些担忧,因为常见问题解答有点不清楚他们需要多少 GDrive/OneDrive 访问权限,如果你必须让他们从根向下访问(这对我来说是不行的),这并不明显或者您是否可以选择单个目录(和子目录)。我过去曾给他们发电子邮件要求澄清,但没有回复……只是想包含这一警告。