Chrome 播放时锁定 HTTP 端口 html 5 视频使用 HTTP 部分内容

Chrome locks HTTP port when playing html 5 video using HTTP partial content

我正在开发一个使用 aspx 网页的复杂 asp.net 应用程序。在其中一个页面中,我需要在弹出页面中显示 15 分钟的视频文件。

我正在使用 HTTP 206 部分内容方法并使用 HttpResponse 的 OutputStream 流式传输大型 mp4 文件。视频播放正常。我在后台有不同的服务 运行,它们也在使用 HTTP 端口。这些服务必须更新并因此发送 Get 消息。我们还维护会话和心跳服务不断检查应用程序状态并在一段时间未收到响应后强制登录。视频开始播放后,HTTP 端口似乎已锁定,因此上述所有通信似乎都被阻止了。这会导致应用程序挂起。

这是常见的行为吗?在播放视频的同时如何维护其他服务?

提前致谢。

鉴于您使用 EnableSessionState="false" 和大写字母 E 听起来您试图从页面隐藏代码更改该设置。会话状态将已经以读写状态创建(默认情况下)并且为当前请求锁定到位,因此从那里更改设置为时已晚。

关闭会话状态,对于当前的 IIs 应用程序,可以通过将 enableSessionState 设置添加到 web.config 文件来实现:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.web>
    <pages enableSessionState="false" />
  </system.web>
</configuration>

或者,对于不需要会话状态的特定页面,您可以将 @ENABLESESSIONSTATE 处理指令添加到它们的第一行:

<%@ ENABLESESSIONSTATE=False %>

如果这是一个 ASP.NET MVC 应用程序,您还可以用 Session State Attribute to apply a particular Session State Behavior:

修饰特定控制器 类
using System.Web.Mvc;

namespace Foo.Bar.Baz
{
    [SessionState(SessionStateBehavior.ReadOnly)]
    public class HomeController : Controller
    {
    //...
    }
}

您可能需要对多个页面执行此操作 - 不仅是其中包含 MP4 视频流的弹出窗口 window,还有调用它的页面。

如果这解决了您的问题,请不要忘记将其标记为答案。

我最终使用 Janus WebRTC Server (https://janus.conf.meetecho.com/) 和 FFMPEG 来解决这个问题。这个想法是将 mp4 文件的内容流式传输到指定的 RTP 端口。 ffmpeg 进程是使用以下 C# 代码启动的。

var 文件路径 = "abc.mp4"; // 将其替换为文件的确切路径

进程 ffmpegProcess = new Process();

var 文件名 = ConfigurationManager.AppSettings["FFMPEGEXEPath"]; // FFMPEG exe 的位置

                        var serverAddress = string.Empty;

                        IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName());

                        foreach (IPAddress address in ipHostInfo.AddressList)
                        {
                            if (address.AddressFamily == AddressFamily.InterNetwork)
                            {
                                serverAddress = address.ToString() + "8004";
                                break;
                            }
                        }

                        var ffmpegParams = " -threads 2 -re -y -i " + filePath + " -an -vcodec libx264 -r 30  -threads:0 16 -tune zerolatency -preset ultrafast -f rtp rtp://" + serverAddress;
                        ffmpegProcess.StartInfo.FileName = "cmd.exe";
                        ffmpegProcess.StartInfo.CreateNoWindow = true;
                        ffmpegProcess.StartInfo.UseShellExecute = false;
                        ffmpegProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
                        ffmpegProcess.StartInfo.Arguments = @"/k " + fileName + " " + ffmpegParams;
                        ffmpegProcess.Start();

如果有人可以在原始问题中提到的上下文中为我的问题提供解决方案,我期待 HTTP 206 部分内容方法。