草庐IT

c# - RangeFileContentResult 和带有远程请求的视频流

coder 2024-05-25 原文

我有一个应用程序,旨在从我们的本地数据库流式传输回视频。昨天我花了很多时间尝试返回数据 RangeFileContentResultRangeFileStreamResult 但没有成功。

简而言之,当我返回文件作为这两个结果中的任何一个时,我似乎无法让视频正确流式传输(或根本无法播放)。

来自浏览器的请求使用以下 header 发送:

Range: bytes=0-

并且提供的响应以这些 header 为例:

Accept-Ranges: bytes
Content-Range: bytes 0-5103295/5103296

就网络流量而言,我得到了一系列 206 的部分结果,最后是 200(根据 fiddler 的说法),这似乎是正确的。 Chrome 的网络选项卡不同意这一点,看到的是一个初始请求(我认为是握手,总是 13 个字节),然后是几个状态为已取消或待处理的请求。 据我了解,这或多或少是正确的,206 - 取消,206 - 取消等。但视频从未播放过。

如果我将结果从我的 Controller 切换到 FileResult,视频将在 Chrome、IE10 和 Firefox 中播放,并且似乎在下载完成之前开始播放(感觉有点像流媒体!虽然我怀疑它是不是)

但是根据范围结果,我在 chrome 或 IE 中什么也得不到,而在 firefox 中一次下载整个视频。

据我所知,RangeFileContentResult 应该处理响应客户端要下载的字节范围(我的似乎没有这样做,它只是告诉它获取整个文件(由上面的响应说明))。客户端应该对此做出响应,但它似乎并没有这样做。

有人在这方面有什么想法吗?具体来说:

a) RangeFileContentResult 是否应该将一系列字节发送回客户端? b) 有什么方法可以显式控制客户端请求的字节范围吗? c) 在请求 RangeFileContentResult 时,是否有任何原因或我在这里做错了什么会导致浏览器根本不加载视频?

编辑:添加了一个图表来帮助描述我所看到的:

EDIT2:好的,所以情节变厚了。在使用 RangedFile gubbins 时,我们需要推出另一个系统测试版本,我在 Controller 操作上留下了“RangeFileContentResult”,如下所示:

private ActionResult RetrieveVideo(MediaItem media)
{
    return new RangeFileContentResult(
        media.Content, 
        media.MimeType, 
        media.Id.ToString(), 
        DateTime.Now);            
}

奇怪的是,现在这似乎在我们的 Azure 系统测试环境中按预期工作,但在我的本地机器上仍然不行。我想知道是否有一些基于 IIS 的东西可以在 Azures IIS8 上正常工作,但在我的本地 7.5 实例上却不行?

最佳答案

此处描述的问题的原因是传递给 RangeFileContentResult 构造函数的 modificationDate 参数的值:

return new RangeFileContentResult(media.Content, media.MimeType, media.Id.ToString(), DateTime.Now); 

RangeFileResult 使用此日期来创建两个 header :

  • ETag - 此 header 是浏览器和服务器用来确保它们谈论的是同一实体的标识符。
  • Last-Modified - 此 header 通知浏览器实体的最后修改日期。

每次浏览器发出部分请求时都会传递 DateTime.Now 的事实可能是 ETagLast-Modified 的原因> 在客户端获得整个实体之前更改 header 值(通常如果整个过程花费的时间超过一秒)。

在上述情况下,浏览器会随请求发送 If-Range header 。此 header 告诉服务器,如果实体标记(或修改日期,因为 If-Range 可以携带这两个值之一)不多,则应重新发送整个实体。这就是这种情况下发生的情况。

如果客户端决定使用以下 header 之一进行验证,那么修改日期是“动态的”这一事实也可能导致进一步的问题:If-Modified-SinceIf-Unmodified-Since , If-Match, If-None-Match.

在这种情况下的解决方案是在数据库中保留文件的修改日期以确保它是一致的。

这里也有可以优化的地方。不是每次发出部分请求时都从数据库中抓取整个视频,而是可以缓存它或只抓取相关部分(如果应用程序使用的数据库引擎允许这样的操作)。通过从 RangeFileResult 传递并覆盖 WriteEntireEntityWriteEntityRange 方法,可以使用这种机制来创建专门的操作结果。

关于c# - RangeFileContentResult 和带有远程请求的视频流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19559591/

有关c# - RangeFileContentResult 和带有远程请求的视频流的更多相关文章

  1. ruby-on-rails - Rails HTML 请求渲染 JSON - 2

    在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这

  2. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

  3. jquery - 我的 jquery AJAX POST 请求无需发送 Authenticity Token (Rails) - 2

    rails中是否有任何规定允许站点的所有AJAXPOST请求在没有authenticity_token的情况下通过?我有一个调用Controller方法的JqueryPOSTajax调用,但我没有在其中放置任何真实性代码,但调用成功。我的ApplicationController确实有'request_forgery_protection'并且我已经改变了config.action_controller.consider_all_requests_local在我的environments/development.rb中为false我还搜索了我的代码以确保我没有重载ajaxSend来发送

  4. C# 到 Ruby sha1 base64 编码 - 2

    我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha

  5. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  6. 动漫制作技巧如何制作动漫视频 - 2

    动漫制作技巧是很多新人想了解的问题,今天小编就来解答与大家分享一下动漫制作流程,为了帮助有兴趣的同学理解,大多数人会选择动漫培训机构,那么今天小编就带大家来看看动漫制作要掌握哪些技巧?一、动漫作品首先完成草图设计和原型制作。设计草图要有目的、有对象、有步骤、要形象、要简单、符合实际。设计图要一致性,以保证制作的顺利进行。二、原型制作是根据设计图纸和制作材料,可以是手绘也可以是3d软件创建。在此步骤中,要注意的问题是色彩和平面布局。三、动漫制作制作完成后,加工成型。完成不同的表现形式后,就要对设计稿进行加工处理,使加工的难易度降低,并得到一些基本准确的概念,以便于后续的大样、准确的尺寸制定。四、

  7. python ffmpeg 使用 pyav 转换 一组图像 到 视频 - 2

    2022/8/4更新支持加入水印水印必须包含透明图像,并且水印图像大小要等于原图像的大小pythonconvert_image_to_video.py-f30-mwatermark.pngim_dirout.mkv2022/6/21更新让命令行参数更加易用新的命令行使用方法pythonconvert_image_to_video.py-f30im_dirout.mkvFFMPEG命令行转换一组JPG图像到视频时,是将这组图像视为MJPG流。我需要转换一组PNG图像到视频,FFMPEG就不认了。pyav内置了ffmpeg库,不需要系统带有ffmpeg工具因此我使用ffmpeg的python包装p

  8. TimeSformer:抛弃CNN的Transformer视频理解框架 - 2

    Transformers开始在视频识别领域的“猪突猛进”,各种改进和魔改层出不穷。由此作者将开启VideoTransformer系列的讲解,本篇主要介绍了FBAI团队的TimeSformer,这也是第一篇使用纯Transformer结构在视频识别上的文章。如果觉得有用,就请点赞、收藏、关注!paper:https://arxiv.org/abs/2102.05095code(offical):https://github.com/facebookresearch/TimeSformeraccept:ICML2021author:FacebookAI一、前言Transformers(VIT)在图

  9. ruby-on-rails - 带有 Zeus 的 RSpec 3.1,我应该在 spec_helper 中要求 'rspec/rails' 吗? - 2

    使用rspec-rails3.0+,测试设置分为spec_helper和rails_helper我注意到生成的spec_helper不需要'rspec/rails'。这会导致zeus崩溃:spec_helper.rb:5:in`':undefinedmethod`configure'forRSpec:Module(NoMethodError)对thisissue最常见的回应是需要'rspec/rails'。但这是否会破坏仅使用spec_helper拆分rails规范和PORO规范的全部目的?或者这无关紧要,因为Zeus无论如何都会预加载Rails?我应该在我的spec_helper中做

  10. Ruby:如何使用带有散列的 'send' 方法调用方法? - 2

    假设我有一个类A,里面有一些方法。假设stringmethodName是这些方法之一,我已经知道我想给它什么参数。它们在散列中{'param1'=>value1,'param2'=>value2}所以我有:params={'param1'=>value1,'param2'=>value2}a=A.new()a.send(methodName,value1,value2)#callmethodnamewithbothparams我希望能够通过传递我的哈希以某种方式调用该方法。这可能吗? 最佳答案 确保methodName是一个符号,而

随机推荐