2011-09-27 56 views
8

我有一個視頻流在rtp上進入ffmpeg,我想將它傳遞給我的OpenCV工具進行實時流式處理。 rtp鏈接正在工作,因爲我可以將傳入數據發送到文件並播放它(或通過ffplay播放)。我的OpenCV實現也很實用,因爲我可以從文件和網絡攝像頭捕獲視頻。從ffmpeg流視頻並使用OpenCV捕獲

問題是流到OpenCV。我聽說這可能是使用命名管道完成的。首先,我可以將ffmpeg輸出流式傳輸到管道,然後讓OpenCV打開這個管道並開始處理。

我已經試過:

我做一個命名管道在我的cygwin的bash是:

$ mkfifo stream_pipe 

接下來我用我的ffmpeg命令從RTP拉流,並將其發送到管:

$ ffmpeg -f avi -i rtp://xxx.xxx.xxx.xxx:1234 -f avi -y out.avi > stream_pipe 

我不知道這是否是去流發送到命名管道,以正確的方式,但它似乎是接受命令和工作,因爲從ffmpeg的給我比特率的輸出, fps等等。

接下來,我使用命名管道在我的OpenCV的捕捉功能:

$ ./cvcap.exe stream_pipe 

其中用於cvcap.cpp代碼歸結爲:

cv::VideoCapture *pIns = new cv::VideoCapture(argv[1]); 

該方案似乎達到這個時候掛一行,所以,我想知道這是否是正確的方式去做這件事。我以前從未使用過命名管道,但我不確定這是否是正確的用法。另外,我不知道是否需要在OpenCV中以不同方式處理命名管道 - 更改代碼以接受這種輸入。就像我說的,我的代碼已經接受了文件和攝像頭輸入,我只是掛在一個流進來。我只聽說命名管道可以用於OpenCV - 我還沒有看到任何實際的代碼或命令!

感謝任何幫助或見解!

UPDATE:

我相信命名管道可能不會在我希望的方式來工作。如在this cygwin論壇帖子上看到的:

問題是Cygwin的fifos實現是非常麻煩的。我不會推薦使用fifos來做最簡單的應用程序。

我可能需要找到另一種方法來做到這一點。我試圖將ffmpeg輸出傳送到普通文件中,然後讓OpenCV同時讀取它。這在某種程度上是有效的,但是我認爲從一個文件同時讀取和寫入可能是危險的 - 誰知道會發生什麼!

+0

我一直在嘗試做類似的事情。你有沒有找到一些解釋管道/等的文章? –

+2

我在ffmpeg-users論壇上發現了這個小帖子http://ffmpeg-users.933282.n4.nabble.com/h264-problem-td2574908.html暗示他完成了什麼,這給了我希望。我還發現有人試圖用VLC http://forum.videolan.org/viewtopic.php?f=32&t=69351和類似的東西x264 http://forums.creativecow.net/readpost/291/84 – chembrad

回答

9

希望現在回答的時間不算太晚,但前段時間我嘗試過同樣的事情,下面是我如何做到的。

OpenCV的視頻解碼後端實際上是ffmpeg,所以它的所有設備都可以在OpenCV中使用。並不是所有的接口都暴露出來,並且增加了一些困難,但是您可以將rtp流地址發送到OpenCV。

cap.open("rtp://xxx.xxx.xxx.xxx:1234"); 

重要:OpenCV的是不能夠訪問受密碼保護的RTP流。要做到這一點,你需要提供用戶名和密碼,沒有暴露的API。

+0

你可以嗎?請提及用於將文件流式傳輸到rtp的命令?你只使用ffmpeg嗎?或者你是否需要安裝其他東西? – user2565010

+0

嗨,先生!您可以說如何使用opencv將圖像寫回rtmp流以通過網絡發送。謝謝! –