我有一個視頻流在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同時讀取它。這在某種程度上是有效的,但是我認爲從一個文件同時讀取和寫入可能是危險的 - 誰知道會發生什麼!
我一直在嘗試做類似的事情。你有沒有找到一些解釋管道/等的文章? –
我在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