2008-10-19 66 views
25

我有圖像從遠程視頻源發送到我的數據庫,每秒約5幀作爲JPEG圖像。我想弄清楚如何將這些圖像轉換爲視頻格式,以便我可以將實時視頻源傳輸到Silverlight。在C#中創建一個MJPEG視頻流

創建MJPEG流似乎有意義,但我遇到了一些問題。首先,我試圖通過HTTP請求進行流式處理,所以我沒有與套接字達成協議,但也許這會破壞我的代碼。

如果我嘗試衝浪我流從QT,我收到了視頻錯誤,媒體播放器顯示第一幀圖像和Silverlight崩潰:)

這裏是流的代碼 - 因爲我用這種方式可以將內容類型只有一次我知道這並不理想,並且可能是根源。所有圖像都通過LINQ2SQL對象進入。

我已經嘗試在Silverlight中更新圖像控件的圖像源,但閃爍是不可接受的。如果Silverlight不支持MJPEG,那麼即使繼續,也沒有任何意義,但看起來確實如此。我確實可以訪問h.264幀,但通過MP4看起來更復雜。

Response.Clear(); 
    Response.ContentType = "multipart/x-mixed-replace; boundary=--myboundary"; 
    ASCIIEncoding ae = new ASCIIEncoding(); 
    HCData data = new HCData(); 
    var videos = (from v in data.Videos 
       select v).Take(50); // sample the first 50 frames 
    foreach (Video frame in videos) 
    { 
     byte[] boundary = ae.GetBytes("\r\n--myboundary\r\nContent-Type: image/jpeg\r\nContent-Length:" + frame.VideoData.ToArray().Length + "\r\n\r\n"); 
     var mem = new MemoryStream(boundary); 
     mem.WriteTo(Response.OutputStream); 
     mem = new MemoryStream(frame.VideoData.ToArray()); 
     mem.WriteTo(Response.OutputStream); 
     Response.Flush(); 
     Thread.Sleep(200); 
    } 

謝謝!

編輯:我有流在Firefox中工作,所以如果我衝浪到頁面,我看到視頻!但沒有別的東西接受這種格式。不是IE,SL,媒體播放器 - 什麼也沒有。

+0

你有沒有得到這個解決? – 2010-06-16 19:43:16

+0

不使用這種方法 - 我只是最終在瀏覽器中使用JS進行背景圖像加載,然後以儘可能快的速度切換圖像。工作好的。 – typemismatch 2010-06-20 03:47:21

回答

0

首先,將你的mjpeg幀寫出來分開文件。然後,您應該能夠在Phototshop中打開這些文件(這將獨立驗證您是否正確解析流)。如果失敗,通過下注就是您的圖像數據中嵌入了HTTP標頭。

0

你看過網上存在的各種網絡攝像頭設置嗎?他們中的很多人做了某種低分辨率更新而沒有閃爍。您應該能夠對這些類型的網站進行逆向工程,以獲得針對您的問題的其他線索。

有些網站創建GIF動畫,也許這是一個選項,以便用戶可以看到過去的一分鐘左右。

1

我遠不是MJPEG流媒體的專家,但在sourcefourge上查看mjpg-streamer的來源,我認爲您應該分別發送每個幀,在每個幀之前和之後寫入邊界。你當然不應該在結束邊界寫內容類型。

2

很久以前(3 - 4年前)我做了MJPEG,我正在試圖記住細節,我根本做不到。但是,如果可能的話,我會建議找到某種能夠傳播MJPEG內容的網站,並啓動wireshark/ethereal並查看你通過網絡獲得的內容。我的猜測是你錯過了一些必要的HTTP頭文件,firefox是一點寬容。

如果您無法通過互聯網找到樣本MJPEG流,很多網絡攝像頭都有可以爲您提供MJPEG流的軟件。我使用的應用程序是用於多個安全攝像頭的控制檯,因此我知道這是所有類型的凸輪(如果它們支持Web界面)的通用實現。

0

關於您的編輯:MJPEG由Firefox和Safari支持。但是,其他應用程序不會像Explorer或Silverlight那樣取決於您使用的是什麼。