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

Posted

技术标签:

【中文标题】将实时视频从我的 c# 应用程序流式传输到 ASP.NET 网页【英文标题】:Streaming live video from my c# application to ASP.NET webpage 【发布时间】:2013-11-30 06:23:27 【问题描述】:

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

但下一步是将实时视频流转换为网络客户端。我尝试通过 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;
    

和 video.WrtieToStream 方法:

public void WriteToStream(Stream outputStream, HttpContent content, TransportContext context)

    try
    
        var buffer = new byte[65536];

        TcpClient serverSocket;
        serverSocket = new TcpClient("localHost", 333);
        NetworkStream netStream = serverSocket.GetStream();

        StreamReader streamReader = new StreamReader(netStream);
        try
        
            var bytesRead = 0;
            while (true)
            
                bytesRead = netStream.Read(buffer, 0, buffer.Length);
                outputStream.Write(buffer, 0, bytesRead);
            
        
        catch (EndOfStreamException)
        
            Console.WriteLine("End of file transaction");
        
        catch (Exception e)
        
            Console.WriteLine(e.Message);
        
    
    catch (HttpException ex)
    
        return;
    
    finally
    
        outputStream.Close();
    

我调试了代码,它似乎工作正常,即它接收传入的视频流并将其写入输出流,但我总​​是黑屏而不是流式传输视频。

当我将 WriteToStream 方法更改为从本地文件(之前从同一场景中保存)而不是从网络中读取视频时,视频运行良好。

我做错了什么?或者是否有其他解决方案可以将实时视频从视频服务器获取到 Web 客户端?

【问题讨论】:

您是否同时解决了这个问题? 【参考方案1】:

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

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)

这可能对你没有帮助,但至少循环体对我来说似乎更自然。

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

【讨论】:

循环中的代码不是最终的,仅用于调试目的。然而,它完成了它的工作。我调试了该代码并检查了与我之前保存到文件中的相同流是否写入了 outputStream。但我总是在页面上出现黑屏......【参考方案2】:

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

【讨论】:

以上是关于将实时视频从我的 c# 应用程序流式传输到 ASP.NET 网页的主要内容,如果未能解决你的问题,请参考以下文章

MVC 视频流式传输到移动网络浏览器

如何将视频从我的应用程序流式传输到网络?

将处理后的视频从 C# 程序发送到 C++ 程序

将实时网络摄像头流式传输到服务器并返回网络的最佳方式是啥?

通过 RTP 流式传输,RTMP 播放质量问题

寻找一个库/框架将实时视频从 OS X 流式传输到 Wowza 服务器(RTMP)[关闭]