[英]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.