如何强制在IWMSinkWriter上留下遗留下来的优秀样本?

时间:2016-12-07 00:32:12

标签: ms-media-foundation

我有一个IWMSinkWriter对象正在接收来自WMA编码器变换的压缩样本。

我想表演" Drain"输入样本仍然停留在接收器写入器上的操作不会被丢弃(因为它当前发生在IWMSinkWriter::Flush()操作中),而是在没有关闭目标文件的情况下被提交到磁盘,类似于调用fflush()在C文件上)。

我认为我传递给IWMSinkWriter的样本最终会写入磁盘,所以我尝试实现这个" Drain"功能如此:

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 个答案:

答案 0 :(得分:1)

您应该使用IMFSinkWriter::Finalize

  

将所有输入样本发送到接收器编写器后调用此方法。该方法执行从媒体接收器创建最终输出所需的任何操作。

该方法在内部排队结束流命令并开始完成输出。待审样本预计将包括在内。

与MFT不同,文件写入不应该在产生尽可能多的输出流方面实现耗尽,然后重新准备接受进一步的输入。大多数文件格式的结构都是在完全最终确定之前文件不可读的方式,并且潜在的排放不能确保将当前提供的数据写入文件并且文件是可读的。在大多数情况下,您有责任在任何书面数据可播放之前完成写作。

因此,您没有方法甚至挑战来处理未完成的数据:您只需继续编写并最终完成。接收器以一些相应方便的方式写入,只有合同才能在完成写入后提供良好的输出文件。请注意,使用ASF格式时,要求有些放松,文件可能 - 在某种程度上 - 如果没有正确完成,仍然可读。

相反,Flushing会丢弃未完成的数据:

  

对于刷新的每个流,接收器写入器会丢弃所有待处理的样本......