从Azure blob存储和ASP.NET Core 3流式传输视频



我使用的是最新推荐的Azure.Storage.Blobs软件包。我正在将视频文件作为块上传,这很好。现在的问题是将视频返回到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()方法。在我的例子中,我将这个流返回给videojs,它自己处理Range头。

在返回之前,请尝试将内存流的位置重置为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

但总的来说,您可以使用提供Seek Start/End位置的CDN:https://docs.vdms.com/cdn/re3/Content/Streaming/HPD/Seeking_Within_a_Video.htm

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

最新更新