使用Azure Blob存储的.Net Core API异步流式传输视频。

问题描述 投票:1回答:1

我找到了一堆例子,这些例子使用的对象在我的应用程序中是不可用的,而且似乎不符合我的.NET Core Web API版本。实质上,我正在做一个项目,该项目将在网页上有标签,并希望使用来自服务器的流来加载视频,而不是直接通过路径来提供文件。其中一个原因是文件的源头可能会改变,通过路径来提供文件不是我的客户想要的。所以我需要能够打开一个流并异步写入视频文件。

由于某些原因,这产生的是JSON数据,所以这是不对的。我正在从Azure Blob存储中下载视频文件,并以流的形式返回,但我只是不明白我需要做什么才能将流媒体视频文件发送到HTML中的标签。

我的API控制器。

[AllowAnonymous]
    [HttpGet("getintroductoryvideos")]
    public async Task<Stream> GetIntroductoryVideos()
    {
        try
        {
            return  _documentsService.WriteContentToStream().Result;
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

我的服务类。

 public async Task<Stream> WriteContentToStream()
    {
        var cloudBlob = await _blobService.GetBlobAsync(PlatformServiceConstants._blobIntroductoryVideoContainerPath + PlatformServiceConstants.IntroductoryVideo1, introductoryvideocontainerName);
        await cloudBlob.FetchAttributesAsync();

        var fileStream = new MemoryStream();
        await cloudBlob.DownloadToStreamAsync(fileStream);
        return fileStream;
    }
c# video-streaming html5-video asp.net-core-webapi azure-blob-storage
1个回答
1
投票

你可以试试下面的代码。

API控制器:

[AllowAnonymous]
[HttpGet("getintroductoryvideos")]
public async Task<FileContentResult> GetIntroductoryVideos(string videoname)
{        
   return  await _documentsService.WriteContentToStream();        
}

服务类:

public async Task<FileContentResult> WriteContentToStream()
{
    var cloudBlob = await _blobService.GetBlobAsync(PlatformServiceConstants._blobIntroductoryVideoContainerPath + PlatformServiceConstants.IntroductoryVideo1, introductoryvideocontainerName);

    MemoryStream fileStream = new MemoryStream();
    await cloudBlob.DownloadToStreamAsync(fileStream);
    return new FileContentResult (fileStream.ToArray(), "application/octet-stream");

}

Html。

<div className="xxx">
  <video height="auto">
      <source src="xx/getintroductoryvideos?videoname=xxx" type="video/mp4" />
  </video>
</div>

1
投票

你可能想避免加载整个视频 在内存中,然后再返回它。你应该可以通过使用一个流来传递 FileStreamResult:

[AllowAnonymous]
[HttpGet("getintroductoryvideos")]
public async Task<IActionResult> GetIntroductoryVideos()
{
  var cloudBlob = await _blobService.GetBlobAsync(PlatformServiceConstants._blobIntroductoryVideoContainerPath + PlatformServiceConstants.IntroductoryVideo1, introductoryvideocontainerName);
  var stream = await cloudBlob.OpenReadAsync();
  return new FileStreamResult(stream, "application/octet-stream");
}
© www.soinside.com 2019 - 2024. All rights reserved.