2016-12-07 32 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

相关问题