我正在使用Media Framework SDK从摄像机捕获视频。 我的代码基于MFCaptureD3D示例。 我的代码和本示例使用IMFSourceReader异步读取相机中的帧。为此,该应用程序提供了IMFSourceReaderCallback的实现,该实现的MFSDK线程在每个可用帧时调用OnReadSample。
该示例有效,除了找不到停止摄像头捕获的可靠方法。特别是,即使在源阅读器上调用了Stop和Shutdown之后,偶尔也会调用OnReadSample回调。如果在调用“停止并关闭”后应用程序处置了OnReadSample中使用的资源,则OnReadSample将崩溃。
我正在寻找一个调用,该调用将加入可能仍在调用OnReadSample的所有挂起线程,以便确保该函数返回OnReadSample时不再被调用。
答案 0 :(得分:0)
后期OnReadSample
回调是可能的,这是由于应用程序具有多线程特性,并且此类调用是从辅助线程启动的。与其他为使代码简洁起见而在回调对象实现中降低效率的示例不同,MFCaptureD3D
在具有常规引用计数的类CPreview
上实现回调。可能有一个较晚的CPreview::OnReadSample
调用,然后是IMFSourceReaderCallback::Release
调用,该调用预期会删除CPreview
实例(除非您出于其他需要引用它)。
话虽如此
答案 1 :(得分:0)
尽管此处发布的答案和评论很有用,但它们并不是我的问题所在。
实际的问题是在销毁了回调对象之后有一个样本到达。我以为我已经使用我的注释中所述的“标志,互斥体和条件变量”解决了这个问题,但是这种实现是不正确的。解决该问题的解决方案如下:
我将添加一个简短的代码来演示这一点