【问题标题】:How do properly stream a video using partial content ranges from Azure blob storage?如何使用 Azure blob 存储中的部分内容范围正确流式传输视频?
【发布时间】:2020-04-08 15:13:41
【问题描述】:

我有一个已上传到 Azure Blob 存储(块、存储 v2)的 mp4 视频。我无法使用<video> 标签提供视频而不会出现播放延迟,因为视频已完全从服务器下载(带有 200 响应状态代码)。

(更糟糕的是,虽然与我的问题不完全相关,因为我认为这更多是浏览器问题,但视频设置为循环播放,并且每次循环都会重新下载。)

我希望使用部分内容范围流式传输视频,以便立即开始播放。

我尝试直接获取视频,为<video> 标签src 属性提供绝对URI;我还尝试通过 ASP .NET Core 3.1 控制器方法提供视频,返回 FileStreamResult 并将 enableRangeProcessing 参数设置为 true。这是代码:

public async Task<IActionResult> GetVideo(string videoUrl)
{
    var httpClient = new HttpClient();
    var stream = await httpClient.GetStreamAsync(videoUrl);
    return File(stream, new MediaTypeHeaderValue("video/mp4").MediaType, true);
}

似乎无论我尝试什么,我都无法获得带有 206 状态代码的范围响应。我已经看到有关使用 Azure 媒体服务的建议,但这似乎有点矫枉过正,而且这应该只是支持而无需合并其他服务。

任何帮助/建议将不胜感激 - 谢谢!

【问题讨论】:

    标签: c# video-streaming html5-video azure-blob-storage asp.net-core-3.1


    【解决方案1】:

    根据我的研究,如果你将enableRangeProcessing参数设置为true,我们会得到范围响应。更多详情请参考issue。

    我的测试代码

    public async Task<IActionResult> Video() {
                var s = Request.Headers;
                var memory = new MemoryStream();
    
                BlobServiceClient blobServiceClient = new BlobServiceClient("DefaultEndpointsProtocol=https;AccountName=blobstorage0516;AccountKey=eGier5YJBzr5z3xgOJUb+snTGDKhwPBJRFqb2nL5lcacmKZXHgY+LjmYapIHL7Csvgx75NwiOZE7kYLJfLqWBg==;EndpointSuffix=core.windows.net");
                BlobContainerClient containerClient = blobServiceClient.GetBlobContainerClient("test");
                var blob =containerClient.GetBlobClient("test.mp4");
                StorageTransferOptions options = new StorageTransferOptions();
                options.InitialTransferLength = 1024 * 1024;
                options.MaximumConcurrency = 20;
                options.MaximumTransferLength = 4 * 1024 * 1024;
                await blob.DownloadToAsync(memory,null, options);
                memory.Position = 0;
                return File(memory, new MediaTypeHeaderValue("video/mp4").MediaType, true); //enableRangeProcessing = true
    
    
    
            }
    

    【讨论】:

    • 我一直在努力解决这个问题; DownloadTo(MemoryStream) 就是答案!谢谢 你能解释一下(或推荐我)StorageTransferOptions 值的来源
    • 嗨 @jim-xu ,您似乎正在将整个视频下载到内存中,是否可以使用 Azure Blob Storage SDK 的范围请求支持?谢谢
    猜你喜欢
    • 2013-11-08
    • 2019-12-04
    • 1970-01-01
    • 2015-04-26
    • 1970-01-01
    • 2020-08-31
    • 1970-01-01
    • 1970-01-01
    • 2019-01-27
    相关资源
    最近更新 更多