2010-12-18 58 views
1

我需要捕獲視頻並每xxx分鐘將其保存到硬盤驅動器。這將是贏得服務,這是永遠的捕獲和保存。會有幾個相機,所以我認爲每個相機使用處理線程。所以如果我決定使用Thread而不是Timer,我應該在保存操作之前使用Thread.Sleep。在我看來,這不是一個好習慣。多線程捕獲視頻

所以問題是我的設計(線程每相機)適合我的情況?關於定時器呢? 謝謝,安德魯

+2

你如何捕捉視頻?你使用哪些API?我問,因爲如果你使用DirectShow,那麼你甚至可以在沒有阻塞當前線程的情況下錄製實時視頻。 – 2010-12-19 00:50:43

+0

是的,我使用DirectShowNet庫。沒有blockng,你的意思是什麼?我應該如何每5分鐘將strean刷新到磁盤。 – 2010-12-19 18:09:21

回答

0

由於全局互斥(例如,在驅動程序中),您的代碼可能會偶爾鎖定。另外,例如,您在一個線程中打開了輸入,將其刷新到某個流中,並且您想從其他線程讀取它:發生互斥鎖。與定時器一樣。考慮到事件驅動的機器太難這裏實現,你仍然可以回退到多個實例..

+0

我認爲我們必須假設1)驅動程序是線程安全的,2)程序員能夠實現線程(考慮互斥和死鎖)。至少有一些可以支持驅動程序不是線程安全的假設。 :) – 2011-02-22 10:20:09

0

你可以看一下對開源項目媒體門戶的代碼在http://www.team-mediaportal.com/

看他們子項目名爲TvEngine3。

您可以強制它將您的相機作爲「調諧器」設備進行圖形化,並將其設置爲通過api進行記錄。

問題是,他們已經制定了數百個DirectShow問題,並且有很多

0

我會明確地去每個相機一個線程作爲機會,你會使用少於20-30相機。但它可能不是必需的,因爲閱讀相機(通常)是非阻塞操作。

在SO上的C#上有幾個關於網絡攝像機和視頻的問題。嘗試查看How do I capture video from a webcam?

請注意,您可能需要預先分配大塊數據以避免磁盤碎片。將多個流媒體視頻存儲到磁盤可能會真正分解內容,然後觀看/複製/修改視頻會非常慢。