我已经开始编写一些流媒体代码,将Windows Media Foundation会话连接到live555流媒体库。到目前为止,我已经开始编写IMFMediaSink
和我自己的IMFStreamSink
。但是,代码变得非常复杂。
我想知道我是否也可以使用IMFSampleGrabberSinkCallback
因为它会收到我要转发的样本555。
在重构代码之前,我想知道MF sink是否真的是一个接收器 - 我记得在DirectShow中,样本采集器不能在没有另一个接收器的情况下使用,因为它是一个转换。我可以构建一个接收样本的拓扑,通过DMO,编码器传递它们,最后到没有任何其他节点的接收器吗?
此外,我想知道这种方法的缺点是什么(假设它可行)?我看到的显而易见的是IMFMediaSink
支持多个流,因此可以协调音频和视频。但是,由于live555纯粹是通过时间戳完成的,因此我没有真正的好处。还有其他缺点吗?
答案 0 :(得分:1)
您可以调用MFCreateSampleGrabberSinkActivate函数来创建激活的MF对象。此函数需要MediaType - 它必须是代码中所需的编码类型。您可以在网站videoinput找到通过MF从网络摄像头捕获视频的示例代码。它包括源代码,并允许RGB24,RGB32,AYUV格式的抓取帧。如果设置H264格式,则MF会为其找到合适的编码器,并使用H264格式的数据找到SampleGrabberSink回调,但必须设置正确的MediaType。
问候。
答案 1 :(得分:1)
示例Grabber与DirectShow Sample Grabber的工作方式非常相似:您可以使用额外的简化外部接口插入管道对象,以便您获得" export"流处理时来自管道的有效负载数据。您提供了一个回调接口,以便在新数据可用时进行调用。对于两个样品采集器都是如此。
DirectShow SG在变换方面更灵活,您可以在拓扑中的任何位置添加它。 MF SG仅是输出节点。 MF SG提供更多回调方法(IMFClockStateSink
方法)。 DirectShow SG是一个非常简单的过滤器[其变体]在源代码中可用作SDK样本。
DirectShow SG最初并不是API核心,但它在开发人员中非常受欢迎。我认为它的受欢迎程度是为MF开发类似组件的主要原因:它们保留了命名,概念 - 一切。与此同时,微软退出了DirectShow SG并将其排除在最新的操作系统版本之外,尽管很明显该API仍在使用中。去了解逻辑。