2

我正在編寫一個RTSP客戶端,並使用Media Foundation將多個IP攝像頭視頻源傳輸到Windows顯示器。據我所知,內置MF RTSP不處理IP攝像頭非常好,所以我必須寫一個自定義媒體來源:我應該爲RTSP客戶端創建一個新線程還是僅使用Media Foundation中的自定義IMFMediaSource

編寫自定義媒體來源:https://msdn.microsoft.com/en-us/library/windows/desktop/ms700134(v=vs.85).aspx

還有以下職位提供了一些有用的提示,但沒有太多的實現細節:通過RTSP

捕捉H264/AAC流使用媒體基金會: https://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/8f67d241-7e72-4509-b5f8-e2ba3d1a33ad/capture-h264aac-stream-via-rtsp-using-media-foundation?forum=mediafoundationdevelopment

如果我WRI在我的自定義媒體源對象中使用我的RTSP代碼,它是否能夠在自己的線程中充分運行,並使用阻止「recv」網絡調用來接收攝像機流數據?或者COM對象不是一個可以處理這種類型的任務的獨立線程?阻止「recv」調用和阻止COM工作隊列之間是否存在潛在的衝突?

或者我應該使用「CreateThread」創建一個新線程來處理所有的RTSP細節並將攝像機流數據轉發給媒體源對象?

任何意見指向我在正確的方向將是偉大的!

回答

1

實現你的媒體來源,並實現內部:

  1. 的CreateThread當你的媒體源「開始」:https://msdn.microsoft.com/en-us/library/windows/desktop/ms700134(v=vs.85).aspx#starting
  2. 使用阻塞的recv(或者你可以實現更多的東西一樣IOCP線程複雜)內你的線程從點1
  3. 隊列當請求新的樣品通過的recv
  4. 交付對應的幀(該隊列的頂部)而獲得的每個RTSP幀:https://msdn.microsoft.com/en-us/library/windows/desktop/ms700134(v=vs.85).aspx#source_data

如果需要還可以引入GAP,或者如果沒有獲得足夠的數據,則重複上次的樣本。

+0

謝謝你的指導!我將按照您所描述的執行此操作。 –

1

Media Foundation通過其設計建議您實現異步處理。有工作隊列,事件生成器,啓動/停止和其他操作預計將被啓動,並且不會與通知/事件異步完成阻塞。

按照這種設計,你不需要太多的線程。媒體基金會建議您改用其工作隊列,根據需要實施線程池。

但是,這並不意味着你不能使用線程。在實現Media Foundation源代碼必需的接口/方法時,必須實現異步模式,但如果您更喜歡在單獨的工作線程上執行實際工作(這在很多情況下會導致更簡單的代碼),那就可以了。

+0

謝謝羅馬R! –

相關問題