繁体   English   中英

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

[英]Streaming live video from my c# application to ASP.NET webpage

我有一个项目需要将实时视频流发送到网络客户端。 我有一个服务器应用程序,它实际上使用 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;
    }
}

和 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 客户端?

可能会出现无限循环。 我不知道 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)

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM