2016-12-07 19 views
2

我有一個IWMSinkWriter對象接收來自WMA編碼器變換的壓縮樣本。我該如何強制要寫在IWMSinkWriter上的優秀樣本?

我想執行一個「漏」操作,其中輸入樣本仍然留在接收器寫入器上不會丟失(因爲它現在發生在IWMSinkWriter::Flush()操作中),而是在不關閉目標文件的情況下提交到磁盤,類似於在C文件上調用fflush())。

我以爲我傳遞給IWMSinkWriter樣品最終會被寫入磁盤,所以我試圖實現這種「流失」 functionallity這樣的:

void WmaWriterBox::HandleCommand(DrainCommand^ command) { 
    HRESULT hRes; 
    BASE::HandleCommand(command); 
    MF_SINK_WRITER_STATISTICS statistics; 
    statistics.cb = sizeof(statistics); 
    // spin-wait until the pending samples are processed 
    while(true) { 
     COM_CALL(_pWriter->GetStatistics(0, &statistics)); 
     if(!statistics.dwNumOutstandingSinkSampleRequests) 
     break; 
     Thread::Sleep(10); 
    } 
} 

不幸的是,優秀的樣本數從來沒有降到零,因此我進入了一個無限循環。

有沒有一種方法可以實現這種「寫入數據到磁盤的寫入」功能?

回答

1

你應該使用IMFSinkWriter::Finalize

調用此方法,你所有的輸入樣本發送到接收器後作家。該方法執行從媒體接收器創建最終輸出所需的任何操作。

該方法在內部排隊結束流命令並開始完成輸出。預計待定樣品將包括在內。

與MFT不同,文件寫入不應該在儘可能多地生成輸出流的情況下執行排空,然後準備好接受進一步的輸入。大多數文件格式的結構方式是在完成最終完成之前文件不可讀,並且潛在的耗盡不會確保將當前饋送的數據寫入文件並且文件可讀。在大多數情況下,您有責任在任何書面數據可回放之前完成書寫。

因此,您沒有處理突出數據的方法或挑戰:您只需繼續寫入並最終完成。接收器分別以一種方便的方式寫入,並且只有合同責任是在完成寫入操作後交付良好的輸出文件。請注意,具體ASF格式的要求有些放鬆,並且文件可能 - 在某種程度上 - 如果沒有正確定稿,仍然可讀。

法拉盛,相反,丟棄撤消數據:

對於刷新每個流水槽作家丟棄所有未決的樣本...

+0

羅馬您好,感謝您的回覆,實際上我不想關閉輸出文件,我只想確保接收器接收的樣本實際寫入磁盤而不保存在內存中。這是爲了保持一致性,因爲我們的DSP微型框架組件支持Drain和Flush操作(就像MF轉換一樣),所以如果我可以在WMA Writer組件上實現Drain操作將會很好。 – BlueStrat

+1

即使在MFT上耗盡可能導致MFT在完全耗盡後進一步輸入的可用性,文件寫入也不是這種情況。沒有排水。在確保運輸中的樣品得到處理方面也沒有太多的實際用途,因爲它不能保證文件中的數據*實際上*並且文件保持可讀。儘管ASF可能是這種情況。在MP4完成之前,即使有排水功能,它仍然無法讀取。 –

+0

感謝羅馬人,如果你發表你最後的評論作爲答案,我會很樂意接受它。 – BlueStrat

相關問題