在DirectShow中以编程方式更改记录文件

| 我使用DirectShow制作了一个控制台应用程序,该应用程序从实时资源(现在是网络摄像头,然后是电视采集卡)中进行记录,在叠加中添加当前日期和时间,然后将音频和视频另存为.asf。 现在,我希望输出文件每60分钟更改一次,而不停止图形。我绝对不能失去直播的任何时间。 该图是这样的: http://imageshack.us/photo/my-images/543/graphp.jpg/ 我看了GMFBridge,但是我的示例有一些编译问题。 我想知道是否有一种方法可以将叠加层滤波器和音频源中存在的内容分开,将它们连接到另一个asf编写器(已暂停),然后每60分钟切换一次。 暂停的asf过滤器的文件名必须更改(pp.asf,pp2.asf,pp4.asf ...)。像这样: http://imageshack.us/photo/my-images/546/graph1f.jpg/ 与pp1暂停。我在互联网上发现一些人说,如果图形没有进入停止模式,则asf编写者将删除当前文件。     
已邀请:
好吧,我拥有的产品(http://www.videophill.com)可以完全满足您的描述(用于广播法规遵从性记录目的)-我发现唯一的方法是: 创建一个dshow图,该图将仅用于捕获音频和视频 然后在图的末尾插入音频和视频的样本采集过滤器 然后,使用
IWMWritter
,使用从samplegrabber过滤器获取的样本来创建并保存wmv文件 时间到了,关闭一个
IWMWritter
并创建另一个。 这样,在切换输出文件时不会丢失任何一帧。 当然,还存在将样本排队和存储样本(在切换编码器时)并适当地重新对齐音频/视频时间戳的问题,但是根据我的研究,这是唯一的“正常”方法做到这一点,我在实践中使用。     
解决方案是编写一个具有两个输入引脚的自定义DShow过滤器。一个用于音频流,另一个用于视频流。您应该在该过滤器内部(从体系结构的角度来看不必在内部,因为您也可以使用回调(例如,在其他地方完成此工作)),您应该创建asf文件。在切换文件时,A / V数据将存储在缓存中(例如,足够大的循环缓冲区)。您还可以在该过滤器中观看和修改A / V同步。对于写入ASF文件,我建议使用Windows Media Format SDK。如果您想进一步传递A / V数据以进行预览,并行流式传输等,还可以添加输出引脚。     
GMFBridge是一个可行的但复杂的解决方案,我过去实现的一种更直接的方法是查询ASF Writer的“ 2”接口并设置自定义接收器。在该界面中,您可以使用一些方法来删除接收器并将其添加到您的ASF编写器。自动连接的接收器将写入您指定的文件。一种写在任何地方的方法是 1.)删除所有默认接收器:
pWriterAdv->RemoveSink(NULL);
2.)注册一个自定义接收器:
pWriterAdv->AddSink((IWMWriterSink*)&streamSink);
自定义接收器可以是实现
IWMWriterSink
的类,它需要实现被调用的回调方法,即,在写入ASF标头(
OnHeader(/* [in] */ INSSBuffer *pHeader);
)和写入数据包(
OnDataUnit(/* [in] */ INSSBuffer *pDataUnit);
)时-在实现中,您可以将其写入到任何地方例如,根据需要在此类上提供其他方法,您可以在其中指定要写入的文件名。 请注意,如果您需要在60分钟的文件中的每一个中写出标头信息,则此解决方案并不能满足您的需要-在初始标头之后,您将仅获得ASF数据包数据。一种解决方法是在每个文件的任何数据包数据之前重写初始头,但是这将产生未索引(不可搜索)的ASF文件。     

要回复问题请先登录注册