![](/img/trans.png)
[英]how can i play VLC live streaming video in asp.net application using HTML video Tag
[英]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.