如何发布 WM ASF Writer 的视频文件
How to release the Video File of WM ASF Writer
我使用这段代码创建一个 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,文件将接收视频流(也不会再次 运行 图形)
感谢任何帮助,谢谢。
您不能只从 DirectShow 图形中删除过滤器而不停止整个图形。仅仅停止并再次 运行 媒体控制过滤器是不够的。当图形为 运行.
时,您甚至无法更改引脚连接
因此,如果您想在无缝继续实时预览的同时停止捕获到文件,我建议有两个选项:
- 使用 Windows 媒体 SDK 创建您自己的
AsfWriter
。这并不难,但您肯定会花一些时间阅读文档并实现这些东西。然后,您的自定义 AsfWriter
可以有一个停止编码、完成文件并告诉过滤器丢弃所有进一步传入样本的例程。我创建了这样一个自定义 AsfWriter
可以在环形缓冲区中对视频进行编码。
- 另一种选择是创建三个图形(捕获、实时取景、实时取景加编码)并通过 GMFBridge 连接它们。无论如何,你需要在那里做一些多线程的事情。
如果您不介意停止图形,则可以创建两个独立的图形:一个捕获并显示预览,另一个仅用于预览。所以在停止第一个图表后,开始第二个。
解决方案是断开 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();
我使用这段代码创建一个 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,文件将接收视频流(也不会再次 运行 图形)
感谢任何帮助,谢谢。
您不能只从 DirectShow 图形中删除过滤器而不停止整个图形。仅仅停止并再次 运行 媒体控制过滤器是不够的。当图形为 运行.
时,您甚至无法更改引脚连接因此,如果您想在无缝继续实时预览的同时停止捕获到文件,我建议有两个选项:
- 使用 Windows 媒体 SDK 创建您自己的
AsfWriter
。这并不难,但您肯定会花一些时间阅读文档并实现这些东西。然后,您的自定义AsfWriter
可以有一个停止编码、完成文件并告诉过滤器丢弃所有进一步传入样本的例程。我创建了这样一个自定义AsfWriter
可以在环形缓冲区中对视频进行编码。 - 另一种选择是创建三个图形(捕获、实时取景、实时取景加编码)并通过 GMFBridge 连接它们。无论如何,你需要在那里做一些多线程的事情。
如果您不介意停止图形,则可以创建两个独立的图形:一个捕获并显示预览,另一个仅用于预览。所以在停止第一个图表后,开始第二个。
解决方案是断开 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();