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