什么时候可以调用IMFSourceReader :: SetCurrentMediaType?

时间:2019-06-05 06:05:02

标签: windows ms-media-foundation

如果我有一个活动的异步IMFSourceReader,何时可以安全地调用SetCurrentMediaType()?

最初,我尝试了IMFSourceReaderCallback :: OnReadSample()和IMFSourceReaderCallback :: OnFlush(),并在关键部分保护了对象的访问权限,但是我遇到了与待处理样本或io完成端口错误有关的错误。

实际上还不清楚在从媒体基础工作线程调用的IMFSourceReaderCallback函数中可以安全调用什么。

我是否必须从回调函数线程外部完全刷新/清空管道,然后从回调线程OnFlush()向回调调用堆栈外部的线程发出信号(确保没有其他样本读取排队)那么可以安全地使用SetCurrentMediaType()更改媒体格式吗?

我是否必须走得更远并销毁SourceReader,然后再次开始重新创建然后设置媒体格式?

2 个答案:

答案 0 :(得分:0)

似乎一旦设置了媒体格式,在源阅读器启动后就无法更改它。因此,您必须销毁源阅读器并重新创建它。

但是然后可靠地销毁异步源阅读器而又不致使Win7挂死是另一个问题...

答案 1 :(得分:0)

我刚遇到这个问题,我通过以下方式在异步模式下正确更改了格式:

  1. 收到格式更改请求时,设置一个标志
  2. 在下一个OnReadSample回调中,读取该标志并且不要调用ReadSample
  3. OnReadSample完成后,阅读器现在可以更改格式了

这对我有用,因为我只在单个相机上进行过测试