我一直在尝试在ASP.NET中设置一个MJPEG流。我想从URL检索MJPEG流,并将收到的每一帧发送给每个连接的客户端。我找到的示例只能从一个预设文件中读取,而不是从URL中连续流式传输,并通过 MultiStreamContent 发送整个文件。由于我逐帧检索,所以我不能这样做。 我想知道是否可以使用ASP.NET MVC实现我的需求。我目前正在使用AForge视频从链接中检索MJPE流。 我的控制器类代码:
using System.Net.Http;
using System.Web.Http;
using AForge.Video;
namespace VideoPrototypeMVC.Controllers
{
public class CameraController : ApiController
{
int framecounter = 0;
MJPEGStream stream = new MJPEGStream();
[HttpGet]
public void GetVideoContent()
{
stream.Source = @"http://127.0.0.1:5002/stream";
stream.NewFrame += new NewFrameEventHandler(showFrame);
stream.Start();
MultipartContent content = new MultipartContent();
while (stream.IsRunning)
{
//Continues streaming should be here?
}
}
//Can be used to display of a frame is available
private void showFrame(object sender, NewFrameEventArgs eventArgs)
{
framecounter++;
System.Diagnostics.Debug.WriteLine("New frame event: " + framecounter);
}
//Should be called at the end of the stream
private void stopStream(object sender, ReasonToFinishPlaying reason)
{
System.Diagnostics.Debug.WriteLine("Stop stream");
stream.Stop();
framecounter = 0;
}
}
}
这段代码不是最终版本,但我只需要让连续流正常运行。我找到了一些使用Socket服务器的示例,但我想坚持使用MVC,因为它可以更轻松地设置服务器的其余部分。
PushStreamContent
。当第一个请求到达时 - 启动您的MJPEG流并将帧写入所有连接的响应流。当最后一个客户端断开连接时 - 停止您的MJPEG流。 - EvkMJPEGStream
接收到的帧是一个字节数组(我这里假设是这样)。然后,你可以直接将这个字节数组写入到连接客户端的响应中。PushStreamContent
允许你以异步方式将内容写入响应流(也就是说,在你的MVC方法已经“返回”之后再进行写入)。你可以向响应流中写入任何内容,不仅限于文件。 - Evk