2010-01-14 39 views
5

我想獲得一些想法,你們中的一些人會如何解決這個問題。 我有一個機器人,運行linux並使用網絡攝像頭(與v4l2驅動程序)作爲其傳感器之一。我用gtkmm編寫了一個控制面板。服務器和客戶端都是用C++編寫的。服務器是機器人,客戶端是「控制面板」。圖像分析發生在機器人上,我想將視頻從攝像機流回控制面板,原因有兩個: A)爲了樂趣 B)重疊圖像分析結果流式視頻來往於多個來源

所以我的問題是什麼將視頻從網絡攝像頭傳輸到控制面板以及優先處理機器人代碼有哪些好方法?我對寫自己的視頻壓縮方案並將其放入現有的網絡端口並不感興趣,但我認爲最好的方法是使用新的網絡端口(專用於視頻數據)。問題的第二部分是如何在gtkmm中顯示視頻?視頻數據異步到達,我無法控制gtkmm中的main(),所以我認爲這會很棘手。

我打算使用vlc,gstreamer或其他任何我不知道的通用壓縮庫。

謝謝!

編輯: 機器人有一個1GHz的處理器,運行一個像Linux版本的桌面,但沒有X11。

+0

只是一個想法:是否有可能在用戶應用程序中使用vlc庫來獲取vlc流媒體視頻?如果是這樣,也許我可以使用vlc流,然後讓圖像分析從回送連接中獲取視頻數據,而控制面板也是這樣做的,但是是遠程的。 – 2010-01-14 02:44:45

+1

不確定vlc,但ffserver相當容易嵌入。 – 2010-01-14 05:45:48

+0

btw,vlc和ffserver都基於ffmpeg(libavcodec/ibavformat) – 2010-01-14 05:46:25

回答

1

Gstreamer只需很少的努力就可以爲您解決幾乎所有這些問題,並且與Glib事件系統很好地集成在一起。 GStreamer包括V4L源代碼插件,gtk +輸出窗口小部件,各種過濾器來調整/編碼/解碼視頻,最重要的是,網絡接收器和源在機器之間移動數據。對於原型,您可以使用'gst-launch'工具組裝視頻管道並對其進行測試,然後在代碼中以編程方式創建管道相當簡單。搜索「GStreamer網絡流媒體」,查看用戶使用網絡攝像頭等進行此類操作的示例。

0

我不確定使用的實際技術,但如果要避免丟幀,最終可能會導致巨大的同步。我在同一時間將視頻流式傳輸到文件和網絡。我最終做的是使用一個帶有三個指針的大循環緩衝區:一個寫和兩個讀。有三個控制線程(和一些額外的編碼線程):一個寫入緩衝區,如果它到達緩衝區中的一個點而不被其他兩個緩衝區讀取,則緩衝區會暫停;以及兩個讀取器線程可以從緩衝區讀取並寫入文件/網絡(如果他們領先於製作人,則暫停)。由於所有內容都是作爲幀寫入和讀取的,因此可以將同步開銷降到最低。

我的製作人是一個代碼轉換器(來自另一個文件源),但在您的情況下,您可能希望相機以通常的任何格式生成整個幀,並且只爲服務器執行代碼轉換(類似ffmpeg) ,而機器人處理圖像。

但是,您的問題稍微複雜一點,因爲機器人需要實時反饋,因此無法暫停並等待流式服務器趕上。因此,您可能希望儘可能快地將幀傳送到控制系統,並分別在循環緩衝區中緩衝一些信息,以便流入「控制面板」。某些編解碼器比其他編解碼器更好地處理丟棄的幀,因此如果網絡落後,可以開始在緩衝區末尾覆蓋幀(注意不要讀取它們)。

+0

我不介意丟幀。無論如何,視頻處理無法處理每一個。 – 2010-01-14 02:17:01

0

當你說'一個新的視頻端口',然後開始談論vlc/gstreaming時,我發現很難制定出你想要的。顯然,這些軟件包將通過多種協議協助流式傳輸和壓縮,但顯然你需要一個「網絡端口」而不是「視頻端口」來發送流。

如果你的意思是通過無線視頻/電視饋送發送顯示輸出這是另一回事,但是你需要硬件專家的建議,而不是軟件專家。

繼續前進。我已經通過MMS/UDP協議進行了大量流式傳輸,並且vlc可以很好地處理它(作爲服務器和客戶端)。然而,它是爲桌面設計的,可能不像您想要的那樣輕巧。就像gstreamer,mencoder或ffmpeg那樣,我認爲會更好。機器人有什麼樣的CPU?如果你正在規劃實時壓縮,你需要一點咕嚕聲。

在客戶端,我想你會發現一些小部件來處理GTK中的視頻。在擔心接口細節之前,我會先研究一下。

+0

是的,對不起。我的意思是「新的網絡端口」,用於視頻數據。 做了一個編輯來反映這一點。 也爲CPU信息編輯。 我並不十分擔心gtkmm小部件,如果必須的話,我知道我可以使用一些SDL小部件...但特定的視頻會更好。 – 2010-01-14 02:23:07