0

我想開發一種將網絡攝像頭視頻作爲輸入的計算機視覺算法。爲此,我需要以與將要製作的圖像相同的格式記錄視頻的訓練數據集。如何將H.264視頻源直接記錄到Windows中的文件中.Media.Capture

我擔心在有損格式編碼的視頻文件,然後進行訓練會降低否則改變訓練圖像,使他們不會完全一樣,我會在生產中看到的圖像解碼他們。

現在,我看到我的網絡攝像頭(上表面臨3運行)的H264視頻源和YUY2視頻源。

所以我認爲 - H264是圖像的來源,YUY2可能是解碼圖像。如果我直接將H264錄製到文件中,然後對該文件進行解碼,那麼解碼圖像將等同於我從YUY2視頻源獲得的圖像。我沒有對新視頻進行編碼,從而改變它,而是使用了已經編碼的源碼H264。

我的問題是:

  1. 是這個假設是真的嗎? H264是否是源代碼,YUY2是源代碼的產品?我該如何檢查?

  2. 如何從H264視頻源直接錄製到文件,無需解碼和重新編碼?

我正在使用新的Windows.Media.Capture API - 但如果需要,我會使用其他API。

+0

忘記了說明我在x64 .NET上。 Windows.Media.Capture不僅適用於UWP。 –

回答

1

Surface Pro 3(與Surface Pro 4不同)配備了相機,可以使用H.264 hardware compression,這就是您將YUY2和H264視爲可用選項的原因。

它是壓縮的視頻,所以YUY2是新進料和H264是其衍生物相機。

是這個假設是真的嗎? H264是否是源代碼,YUY2是源代碼的產品?我該如何檢查?

不,這是相反的。

如何從H264視頻源直接錄製文件而無需解碼和重新編碼?

讀取H264並將其路由到多路複用器以產生具有H264視頻軌道的MP4文件。 Windows Media Foundation的源代碼閱讀器和接收器編寫器(可能還有媒體會話API)絕對有可能,而且我不確定Windows.Media.Capture可能是上述提到的一層。

+0

好。如果H.264是衍生產品,那麼在軟件中使用相機編碼進料通過重新編碼是沒有好處的,因爲我會以任何方式丟失原始數據。 –

+0

優勢可能是零負載壓縮(儘管在很多情況下,您仍然可以選擇使用硬件H.264壓縮器捕獲原始數據和壓縮數據),然後相機可能能夠使用特定參數/模式進行壓縮,例如SVC。最後,在H.264中進行捕捉可以在很多情況下實現更高的分辨率/速率組合。 –

+0

所有這一切都是事實。我不清楚如何使用MediaCapture錄製該流,而無需重新編碼。我很困擾它能夠「偷偷地」重新編碼,沒有任何跡象表明正在發生。我希望按照您的建議使用Windows Media Foundation並直接記錄流。 –

0

您可以從UWP SDK檢查CameraFrames樣本:https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/CameraFrames

基本上,它創造了一個攝像頭,並MediaFrameReader訂閱它的FrameArrived事件。您應該有權訪問H264框架並將其提供給接收器。或者使用MediaCapture.StartRecordToCustomSinkAsync,您需要提供自定義IMediaExtension媒體接收器。檢查SimpleCommunication示例:https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/SimpleCommunication

+0

我正在使用MediaCapture.StartRecordToStorageFileAsync錄製到存儲文件。爲什麼我需要CustomSink? 問題是,無論輸入分辨率爲**,文件的寬度分辨率都是**,表示它已被重新編碼。
根據[MediaCapture API](https://docs.microsoft.com/en-us/uwp/api/windows.media.capture.mediacapture):*如果本機類型爲H.264,則可以錄製使用類型與本機類型相同的視頻媒體類型。您無法將效果添加到H.264本機類型流* –

1

因此,如果我正確理解您,您說網絡攝像機已公開兩種不同的可能流:H.264編碼流和YUY2編碼流。您的假設是網絡攝像機將h.264提要作爲主要格式公開,然後將其解壓縮爲YUY2格式。

這是最肯定不是的情況下,YUY2格式是受網絡攝像頭和h.264飼料捕獲的原始數據被該數據的壓縮格式。所以你可以放心,它不是有損的。

有一些例子描述瞭如何將數據寫入文件。