我使用此代码创建,并将asf Writer添加到我的图形
IFileSinkFilter pTmpSink = null;
IBaseFilter asfWriter = null;
int hr = capGraph.SetOutputFileName( MediaSubType.Asf, szOutputFileName,
out asfWriter, out pTmpSink);
我想停止保存视频捕获,释放视频文件,然后重新运行图表以便继续预览。
m_mediaCtrl.Stop();
Marshal.ReleaseComObject(asfWriter);
m_mediaCtrl.Run();
问题是当我发布asfWriter时,文件没有收到视频捕获,它的大小总是5.08KB。如果我没有释放asfWriter,文件会收到视频流(也没有再次运行图形)
我感谢任何帮助,谢谢。
答案 0 :(得分:1)
您不能在不停止整个图表的情况下从DirectShow图表中删除过滤器。只是停止并再次运行媒体控制过滤器是不够的。在图表运行时,您甚至无法更改引脚连接。
因此,如果您希望在无缝继续实时预览的同时停止捕获文件,我可以建议两个选项:
AsfWriter
。这并不难,但你肯定会花一些时间阅读文档并实现这些东西。然后,您的自定义AsfWriter
可能会有一个停止编码的例程,最终确定文件并告诉过滤器只删除所有其他传入的样本。我已经创建了一个可以在环形缓冲区中对视频进行编码的自定义AsfWriter
。如果您可以停止图表,那么您可以创建两个独立的图表:一个用于捕获和显示预览,另一个用于预览。因此,在停止第一个图表后,启动第二个图表。
答案 1 :(得分:1)
解决方案是断开asfWriter与图表的连接,然后将其删除。 在我的情况下,它连接了SmartTee的引脚0。希望这有助于其他人。
m_mediaCtrl.Stop();
if(asfWriter != null)
{
IPin pin = DsFindPin.ByDirection(iSmartTee, PinDirection.Output, 0);
hr = m_FilterGraph.Disconnect(pin);
hr = m_FilterGraph.RemoveFilter(asfWriter);
}
m_mediaCtrl.Run();