本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

使用HTML5视频标签从Google云端硬盘流式传输视频

发布于2021-04-15 13:57     阅读(909)     评论(0)     点赞(25)     收藏(1)


我正在尝试从Google云端硬盘流式传输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时,将显示我必须接受的安全请求。我认为这是问题所在,因为它阻止了下载。也许我在URL中缺少一些参数?如何在Google云端硬盘阻止请求的情况下流式传输更大的文件?


解决方案


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

  • 获取视频的共享链接。可以通过右键单击Google云端硬盘中的视频,然后单击获取共享链接按钮来完成。将此链接复制到剪贴板。

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

  • 选择您想要的质量。使用Google云端硬盘播放器,然后选择所需的质量,例如1080p或720p。单击播放以确保质量已更改。

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

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

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

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

重要的是要知道每个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);
          }
      }
    

上面的代码只是从您先前获得的链接中下载源代码。然后,将其用逗号分隔,因为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云端硬盘的方法简单得多。

替代解决方案

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

  • 启用Google云端硬盘API。确保您已登录要从中流式传输文件的Google帐户。您可以访问链接以启用Google云端硬盘API。
  • 获取API密钥。通过访问链接,您可以生成一个API密钥以访问Google云端硬盘。系统可能会提示您创建一个新项目。
  • 获取文件ID。访问Google云端硬盘并找到您要流式传输的文件。确保它对公众可用。在新选项卡中将其打开,然后复制文件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云端硬盘,并获取它们的共享链接。然后,您可以将链接更改为其可下载的变体,如下所示:

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

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

<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
        };
    }
}

Then, you can call this GET request as /segment?id=[GOOGLE_DRIVE_ID]. This method will essentially return the direct download stream to the client with the appropriate headers which allows the video player to stream the playlist correctly. Bare in mind, the above example is for .NET Core.

There are plenty of tutorials on how to produce M3U8 files from existing video clips. I recommend FFmpeg as it is extremely simple to create these files. Apple has a guide on M3U8 available here. Since you are not live streaming, you will need a VOD (video on-demand) playlist. This method is recommended for large videos. If you do not want to compress your large videos, splitting them and delivering them in small segments will help you and you can use Google Drive to host the segments (you will need to remux your videos into .ts or .m2ts in order to split and avoid re-encoding). This is also a fantastic solution for seeking and buffering as direct downloads like the solutions above may not allow you to seek and the links also expire. YouTube uses a similar setup to deliver videos to the client.




所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接:http://www.qianduanheidong.com/blog/article/67379/58dcc276dd519c69e518/

来源:前端黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

25 0
收藏该文
已收藏

评论内容:(最多支持255个字符)