簡體   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