繁体   English   中英

Stream 视频来自 Azure blob 存储和 ASP.NET 核心 3

[英]Stream videos from Azure blob storage and ASP.NET Core 3

我正在使用最新和推荐Azure.Storage.Blobs package。 我将视频文件作为块上传,效果很好。 现在的问题是将视频返回给 web 客户端,即videojs 播放器正在使用Range请求。

我的端点:

[HttpGet]
[Route("video/{id}")]
[AllowAnonymous]
public async Task<IActionResult> GetVideoStreamAsync(string id)
{
   var stream = await GetVideoFile(id);

   return File(stream, "video/mp4", true); // true is for enableRangeProcessing
}

还有我的GetVideoFile方法

var ms = new MemoryStream();
await blobClient.DownloadToAsync(ms, null, new StorageTransferOptions
{
    InitialTransferLength = 1024 * 1024,
    MaximumConcurrency = 20,
    MaximumTransferLength = 4 * 1024 * 1024
});

ms.Position = 0;

return ms;

视频被下载并流式传输就好了。 但它下载了整个视频,根本不尊重Range 我也试过DownloadTo(HttpRange)

var ms = new MemoryStream();

// parse range header... 
var range = new HttpRange(from, to);
BlobDownloadInfo info = await blobClient.DownloadAsync(range);
await info.Content.CopyToAsync(ms);
return ms;

但是浏览器中没有显示任何内容。 实现这一目标的最佳方法是什么?

如果有人遇到,请回答我自己的问题。

CloudBlockBlob (我正在使用的版本:11.2.2)现在具有OpenReadAsync()方法,该方法返回 stream。 在我的情况下,我将这个 stream 返回给videojs ,它自己处理Range header。

请尝试在返回之前将 memory 流的 position 重置为0

var ms = new MemoryStream();

// parse range header... 
var range = new HttpRange(from, to);
BlobDownloadInfo info = await blobClient.DownloadAsync(range);
await info.Content.CopyToAsync(ms);
ms.Position = 0;//ms is positioned at the end of the stream so we need to reset that.
return ms;

我相信仅使用 Azure Blob 是不可能实现的。 更多信息在这里: https://stackoverflow.com/a/26053910/1384539

但总而言之,您可以使用提供搜索开始/结束 position 的 CDN: https://docs.vdms.com/cdn/re3/Content/Streaming/HPD/Seeking_Within_a_Video.htm

另一种可能性是使用支持流媒体的 Azure 媒体服务。 您的方法实际上是一种渐进式下载,这不是完全相同的想法,您可能会在网络外花费很多。 (假设您对同一个文件有很多访问权限)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM