【问题标题】:Does Azure Blob Storage supports partial content 206 by default?Azure Blob 存储是否默认支持部分内容 206?
【发布时间】:2020-08-23 15:15:44
【问题描述】:

我正在使用 Azure blob 存储来存储我的所有图像和视频。我已经实现了上传和获取功能,它工作得很好。我在加载视频时遇到了 1 个问题,因为当我使用在 Azure blob 存储上上传该视频后生成的 url 时,它会先下载所有内容,然后再将其呈现给用户。因此,如果视频大小为 100 mb,它将下载所有 100 mb,直到用户无法看到视频。

我做了很多研发,才知道在渲染视频时,我需要获取部分内容(状态 206),而不是一次获取整个视频。添加请求标头“Range:bytes-500”后,我尝试点击博客网址,但它仍在下载整个内容。因此,我检查了一些开源视频 URL,并尝试点击视频 URL 以及“范围”请求标头,它成功地给出了 206 响应状态,这意味着它正确地给了我部分内容而不是完整的视频。

我阅读了一些论坛,他们说 Azure 存储支持部分内容概念,需要从属性中启用它。但是我检查了 Azure 存储帐户下的所有选项,但没有找到启用此功能的任何内容。

谁能帮我解决这个问题,或者我需要在 Azure 门户上启用什么?一个星期以来,我一直在为此进行研发。任何帮助将不胜感激。

谢谢!保持安全。

【问题讨论】:

  • 你解决了吗?
  • @ZiadAkiki,很抱歉回复晚了,但是是的,我已经通过更新 azure blob 存储 API 版本解决了这个问题。

标签: azure video-streaming rendering azure-blob-storage


【解决方案1】:

假设Accept-Ranges没有启用,从这个blog我得到它需要set the default version of the service

下面是实现它的示例代码。

            var credentials = new StorageCredentials("account name", "account key");
            var account = new CloudStorageAccount(credentials, true);
            var client = account.CreateCloudBlobClient();
            var properties = client.GetServiceProperties();
            properties.DefaultServiceVersion = "2019-07-07";
            client.SetServiceProperties(properties);

下面是设置属性后的返回头对比。

之前

之后

【讨论】:

    【解决方案2】:

    假设视频内容是 MPEG-4,问题可能是媒体本身需要将 moov atom 位置从文件末尾更改为开头。浏览器在找到文件中的 moov atom 之前不会渲染视频,因此您要确保 atom 位于文件的开头,这可以使用带有“FastStart”的 ffmpeg 来完成。这是一篇更详细的好文章:HERE

    【讨论】:

    • 嗨 @Aaron,我已经更新了 azure blob 存储 API 版本并解决了这个问题。
    【解决方案3】:

    以下是我用来下载内容的SDK:

    var container = new BlobContainerClient("UseDevelopmentStorage=true", "sample-container");
    await container.CreateIfNotExistsAsync();
    BlobClient blobClient = container.GetBlobClient(fileName);
    Stream stream = new MemoryStream();
    var result = await blobClient.DownloadToAsync(stream, cancellationToken: ct);
    

    它会立即下载整个文件!不幸的是,其他答案中提供的解决方案似乎引用了另一个 SDK?所以对于我使用的SDK——解决方法是使用OpenReadAsync的方法:

            long kBytesToReadAtOnce = 300;
            long bytesToReadAtOnce = kBytesToReadAtOnce * 1024;
            //int mbBytesToReadAtOnce = 1;
            var result = await blobClient.OpenReadAsync(0, bufferSize: (int)bytesToReadAtOnce, cancellationToken: ct);
    

    默认情况下 - 它会获取 4mb 的数据,因此如果您希望您的应用占用更少的内存,则必须将该值覆盖为更小的数量。

    我认为 SDK 在内部发送已设置字节范围的请求。因此,您所要做的就是启用 Web API 中的部分内容支持,如下所示:

            return new FileStreamResult(result, contentType)
            {
                EnableRangeProcessing = true,
            };
    

    【讨论】:

      猜你喜欢
      • 2018-07-13
      • 1970-01-01
      • 1970-01-01
      • 2013-03-11
      • 2021-05-08
      • 2016-12-07
      • 2016-08-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多