【问题标题】:Stream video from RavenDB through ASP.Net MVC通过 ASP.Net MVC 从 RavenDB 流式传输视频
【发布时间】:2018-08-29 19:39:49
【问题描述】:

我正在尝试通过 ASP.NET MVC 5 Action 将视频流式传输到 WebBrowser,该视频作为附件保存在 Ravendb 数据库中。它正在使用以下代码,但视频在视频开始之前已完全下载。我不明白我做错了什么。

我找到了一些在 MVC 中进行流式处理的方法,但他们似乎期望一个可搜索的流 - 但我从 Ravendb 收到的流是不可搜索的;它甚至没有提供长度。因此,这样做的唯一方法是将 ravendb-stream 复制到 memorystream 并从那里提供 PartialContent 或类似内容。

有人有更好的解决方案吗?我不可能是唯一一个想要从数据库中流式传输视频而不在发送之前将完整视频加载到内存中的人。

我正在像这样从 ravendb 获取附件:

public async Task<System.IO.Stream> GetAttachmentAsync(IAttachmentPossible attachedObject, string key)
{
    using (var ds = InitDatabase())
    {
        using (var session = ds.OpenAsyncSession())
        {
            try
            {
                var result = await session.Advanced.Attachments.GetAsync(attachedObject.Id, key);
                return result.Stream;
            }
            catch (Exception ex)
            {
                return null;
            }
        }
    }
}

之后我像这样将流发送到浏览器:

var file = await _database.GetAttachmentAsync(entry, attachmentId);

HttpResponseMessage msg = new HttpResponseMessage(HttpStatusCode.OK);
msg.Content = new StreamContent(file);
msg.Content.Headers.ContentType = new MediaTypeHeaderValue("video/mp4");
return msg;

有什么想法吗?非常感谢!

【问题讨论】:

标签: c# asp.net-mvc ravendb


【解决方案1】:

我认为将流复制到内存流中是正确的。使用您链接的答案 (https://stackoverflow.com/a/39247028/10291808),您可以进行流式传输。

或许可以考虑通过多次调用从数据库中检索文件(也许您可以在有限的时间内缓存文件以提高性能)。

【讨论】:

  • 但是如果我有 GB 大小的视频文件怎么办?将它们保存在内存中可能会导致问题。而且我仍然需要等待视频从 ravendb 加载到内存,直到我可以将第一个字节提供给客户端。
  • @TopperDEL 您可以按要下载的范围分割存储它。如果您有 GB 的视频,如果您从 Raven 加载它或将其保存在内存中,问题仍然存在。
  • 嗯,主要问题似乎是 raven 没有提供从二进制附件访问范围的方法。如果这是可能的,那将不是问题。在内存中只保留部分 GB-Video 不适用于 curretn raven-implementation,因为我只能一次下载整个文件。不过,谢谢。
猜你喜欢
  • 1970-01-01
  • 2019-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 2012-03-26
相关资源
最近更新 更多