将实时视频从我的c#应用程序流到ASP.NET网页

将实时视频从我的c#应用程序流到ASP.NET网页,c#,asp.net-mvc-4,video-streaming,directshow,directx-11,C#,Asp.net Mvc 4,Video Streaming,Directshow,Directx 11,我有一个项目,需要发送实时视频流到网络客户端。我有一个服务器应用程序,它使用DirectShow从Direct3D场景中生成实时视频流。我有自己的DirectShow源过滤器,其输出使用WEBM编解码器进行压缩。它在将视频流保存到文件时工作良好,以后可以毫无问题地查看该文件 但下一步是将实时视频流转换为web客户端。我试图通过TCP将其发送到我的ASP.NET MVC4应用程序。我的页面控制器如下所示: public class VideosController : ApiController

我有一个项目,需要发送实时视频流到网络客户端。我有一个服务器应用程序,它使用DirectShow从Direct3D场景中生成实时视频流。我有自己的DirectShow源过滤器,其输出使用WEBM编解码器进行压缩。它在将视频流保存到文件时工作良好,以后可以毫无问题地查看该文件

但下一步是将实时视频流转换为web客户端。我试图通过TCP将其发送到我的ASP.NET MVC4应用程序。我的页面控制器如下所示:

public class VideosController : ApiController
{
    /// <summary>
    /// Web API method to paste into videocontainer in "video" tag on web page
    /// </summary>
    /// <param name="filename">File name with location path</param>
    /// <param name="ext">Videofile extension</param>
    /// <returns>Return stream content</returns>
    public HttpResponseMessage Get(string filename, string ext)
    {
        var video = new VideoStream();

        var response = Request.CreateResponse();
        response.Content = new PushStreamContent(video.WriteToStream, new MediaTypeHeaderValue("video/" + ext));

        return response;
    }
}
我调试了代码,它似乎工作正常,也就是说,它接收传入的视频流并将其写入输出流,但我总是得到黑屏,而不是流式传输的视频

当我将WriteToStream方法更改为从本地文件(先前从同一场景中保存)而不是从网络读取视频时,视频工作正常


我做错了什么?或者可能有其他解决方案可以将实时视频从视频服务器传输到web客户端?

可能存在无限循环。我不知道NetStream的详细情况,但对我来说,大多数流在到达文件末尾时都不能抛出异常。如果我没有遗漏什么,可能会发生这样一种情况,您永远无法到达
outputStream.Close()

我会把它改成

do
{
    bytesRead = netStream.Read(buffer, 0, buffer.Length);
    outputStream.Write(buffer, 0, bytesRead);
}
while (bytesRead > 0)
这可能对你没什么帮助,但至少,我觉得环体更自然


对于这个概念:如果你的应用程序在服务器端有状态,我会在两侧都有一个字节的缓冲区,客户端可能有两个缓冲区,一个用于播放,另一个用于保存数据以备将来播放,第一个缓冲区最初会被填满,当播放视频时,他会向服务器请求新的数据(这可能是异步发生的)然后将它们保存到第二个缓冲区,而在服务器上,只有文件的某些部分会保存在内存中。

使用带有rtmp模块的nginx,通过Ffmpeg将视频数据写入rtmp流,然后使用rtmp播放器在网页中播放视频。

循环中的代码不是最终的,它仅用于调试目的。但是它完成了它的工作de并检查outputStream中写入的流是否与我之前保存到文件中的流相同。但我总是在页面上出现黑屏…您是否同时解决了此问题?
while (true)
{
    bytesRead = netStream.Read(buffer, 0, buffer.Length);
    outputStream.Write(buffer, 0, bytesRead);
}
do
{
    bytesRead = netStream.Read(buffer, 0, buffer.Length);
    outputStream.Write(buffer, 0, bytesRead);
}
while (bytesRead > 0)