2012-02-16 122 views
0

我試圖將從捕獲卡接收的4:2:0 rawdata寫入AVI文件。對於每個像素char緩衝區包含2個字節(16位)。數據的順序與FOURCC UYVY:YUV 4:2:2相同(每個像素Y採樣,每行水平每隔一個像素採樣一次U和V)。一個macropixel包含1個u_int32中的2個像素。通過C++中的DirectShow將YUV-Rawdata寫入AVI文件

首先我嘗試了OpenCV Videowriter。但是這對於這麼大量的視頻數據來說太慢了(我正在捕獲2個視頻流,每個視頻流都是1080p25格式),所以我轉而使用Windows的「Video for Windows」庫。但即使這樣,也不會實時進行文件寫入。我最後的機會是Directshow。我想用AVI Mux和File Writer Filters將我的原始數據存儲爲AVI文件,但我不知道如何「給」AVI Mux我的原始數據(char數組),它只包含視頻數據UYVY順序和沒有音頻。也許你可以給我一個建議。這是我有什麼,直到如今:

CoInitialize(NULL); 
    IGraphBuilder*pGraph= NULL; 
    CoCreateInstance(CLSID_FilterGraph, NULL,CLSCTX_INPROC_SERVER,IID_IGraphBuilder, (void **)&pGraph); 

    IMediaControl*pMediaControl= NULL; 
    pGraph->QueryInterface(IID_IMediaControl,(void **)&pMediaControl); 

    ICaptureGraphBuilder2 *pCapture= NULL; 
    CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL,CLSCTX_INPROC,IID_ICaptureGraphBuilder2, (void **)&pCapture); 

    IBaseFilter *pMux; 
    pCapture->SetOutputFileName(&MEDIASUBTYPE_Avi,L"Test.avi",&pMux,NULL); 

    IBaseFilter *pCap; 
    pCapture->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video,pCap,NULL,pMux); 

THX了很多和問候,

瓦倫丁

回答

0

(至於你提到的前一個問題,我認爲是有效的幀率10幀)您是否將每像素10 fps的雙1920x1080 12位寫入文件?這是每秒60兆字節,您可能剛剛達到您的硬盤寫入容量限制。

如果您的硬盤功能不夠強大,選擇不同的API不會有幫助。您需要壓縮數據或降低分辨率或FPS。或使用更快的驅動器。

+0

有時簡單的解決方案是最好的^^。多謝。使用RAID解決了這個問題。問候 – user1213697 2012-02-16 15:20:16