2011-05-17 53 views
1

我做了一个控制台应用程序,使用DirectShow,从活源(现在的摄像头,然后是电视采集卡)记录,添加当前日期和时间的叠加,然后保存音频和视频.ASF。 现在我想的是,输出文件是要改变每60分钟不停止的图。我不能放松直播的任何时间。 该图是这样的一个:变化记录文件编程DirectShow中

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编写者会删除当前文件。

回答

0

GMFBridge是一个可行但复杂的解决方案,我过去实施的更直接的方法是查询您的ASF Writer的IWMWriterAdvanced2接口并设置自定义接收器。在该界面中,您可以使用方法删除并将接收器添加到您的ASF编写器。自动连接的接收器将写入您指定的文件。

pWriterAdv->RemoveSink(NULL); 

2)注册一个自定义接收:

pWriterAdv->AddSink((IWMWriterSink*)&streamSink); 

的自定义接收器可以是一个类来写。无论您想为

1)删除所有默认汇的一种方式实现IWMWriterSink,这需要实现回调方法,即在写入ASF头(OnHeader(/* [in] */ INSSBuffer *pHeader);)和写入数据包(OnDataUnit(/* [in] */ INSSBuffer *pDataUnit);)时调用 - 在您的实现中,您可以将它们写入任意位置, xample提供了此类上的其他方法,您可以在其中指定要写入的文件名。

请注意,如果您需要在每个60分钟的文件中写出标题信息,此解决方案并不完全符合您的要求 - 在初始标题之后,您只能获得ASF数据包数据。一种用于该解决方法可能是之前的每个文件的任何分组数据重新写的INTIAL头,然而,这将产生一个没有索引的(非可搜索)ASF文件。

1

那么,我有产品(http://www.videophill.com),完全符合您所描述的(用于广播合规性录制目的) - 我发现唯一的方法是这样的:

  • 创建将仅用来捕捉音频和视频
  • 然后,在图形端部的DSHOW图表,插入samplegrabber过滤器,无论是音频和视频
  • 然后,使用IWMWritter创建和保存WMV文件,使用样本samplegrabber过滤器获取
  • ,当时间一到,关闭一个IWMWritter,创造一个又一个。

这样,切换输出文件时不会丢失单帧。

当然,还有排队和存储样本(切换书写器时)和适当重新调整音频/视频时间戳的问题,但是从我的研究中,这是唯一的“正常”方式它,我在实践中使用。

1

解决方案是在您的案例中编写一个自定义的DShow过滤器和两个输入引脚。一个用于音频流,另一个用于视频流。在该过滤器内部(从体系结构的角度来看,不必是内部的,因为您也可以使用回调,例如在其他地方执行该任务),您应该创建asf文件。在切换文件时,A/V数据将被存储在缓存中(例如足够大的循环缓冲区)。您也可以在该滤镜中观看和修改A/V同步。为了编写ASF文件,我建议使用Windows Media Format SDK。
如果您希望进一步传递A/V数据(如果需要进行预览,并行流式传输等),您还可以添加输出引脚...