2013-08-20 143 views
0

我一直在試圖找到一種方式來顯示我的攝像頭流30秒的延遲。 我發現VLC能夠做到這一點,但問題是,幀率太低,並且不流暢或可見。我必須在一臺相當舊的筆記本電腦上運行這個更好的攝像頭,因此我認爲這不是一個選項。顯示攝像頭流延遲

我有點熟悉c#/ C++和python,所以我認爲我可以爲自己做一個解決方案,因爲任務看起來相當簡單。雖然,問題是,我不知道從哪裏開始,並且正確方向的任何推動都會受到高度讚賞。

我最初的想法是記錄流的前30秒到磁盤,然後使用VLC查看部分文件(AFAIK它能夠做到這一點)。這是一個值得處理的想法嗎?還是應該在最近30秒內使用某種緩衝器來處理視頻幀?

再次,任何在正確的方向輕推將非常感謝,謝謝!

回答

2

看一看OpenCV。 它可以檢索並顯示來自網絡攝像頭的圖像。

許多教程也可用;例如http://opencv.willowgarage.com/wiki/CameraCapture

因此,只需創建一個數組(或其他)來保存30秒內預期的圖片數量(FPS * 30)。

開始檢索圖像,並且一旦數組被填充,就從位置0開始播放。 新檢索的圖像可以存儲在「剛」顯示的圖像的位置。

0

Miguel Grinberg已經用Python編寫了一個優秀的視頻流教程,它依次發送JPEG幀。這裏檢查他的博客:

http://blog.miguelgrinberg.com/post/video-streaming-with-flask1

每個JPEG可以快速審查,然後播出。 [要考慮所需的延遲]

就獲取輸入視頻饋送而言,您可以使用OPENCV連接攝像頭。 OpenCV使用VideoCapture將原始圖像作爲字節返回。這些字節需要編碼爲JPEG並與Miguel的代碼進行接口。

import cv2 

class VideoCamera(object): 
    def __init__(self): 
    # Using OpenCV to capture from device 
    self.video = cv2.VideoCapture(0) 

    def __del__(self): 
    self.video.release() 

    def get_frame(self): 
    success, image = self.video.read() 
    # We are using Motion JPEG, but OpenCV defaults to capture raw images, 
    # so we must encode it into JPEG in order to correctly display the 
    # video stream. 
    ret, jpeg = cv2.imencode('.jpg', image) 
    return jpeg.tobytes() 

這種方法將幫助您滿足所有需要的功能:

  • 沒有互聯網需要
  • 可調延遲 - 您可以輕鬆控制要對每一幀進行延遲和處理
  • 良好的質量
  • 按需記錄 - 根據需要存儲捕獲的幀
  • 有記錄通過只保存以前的24 * x幀(24fps流)