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



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

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

这是常见的行为吗?在播放视频时,我需要做什么来维护其他服务?

提前谢谢。

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

关闭当前 II 应用程序的会话状态可以通过将 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 应用程序,您还可以使用会话状态属性修饰特定的控制器类,以应用特定的会话状态行为:

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

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

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

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

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

进程 ffmpegProcess = new 进程();

var fileName = 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 部分内容方法。

最新更新