Directshow源码分析之推模式

本文分析了Windows SDK中的Directshow推模式Source Filter示例,功能是生成弹球运动轨迹的视频帧。通过CBouncingBall和CBallStream类的继承,实现Filter在数据线程中不断推送Sample。关键点包括输出Pin的创建和首选媒体类型的设置。
摘要由CSDN通过智能技术生成

在windowsSDK中有一个推模式的Source Filter例子,位于SDK安装目录samples\C++\Directshow\Ball下。

下面做一下简要分析:

功能:Live Source不断产生视频帧,演示在封闭围墙内碰撞的弹球的运动轨迹。使用该filter构建Filter Graph及其输出结果如下图:



类的继承结构关系为:

CBouncingBall继承自CSource

CBallStream继承自CSourceStream

可以知道,从CSource派生的Filter,它的输出Pin会使用一个数据线程,将Sample不断的推出去,具体实现如下:

//
// DoBufferProcessingLoop
//
// Grabs a buffer and calls the users processing function.
// Overridable, so that different delivery styles can be catered for.
HRESULT CSourceStream::DoBufferProcessingLoop(void) {

    Command com;

    OnThreadStartPlay();//开始数据传送前调用,子类可以重新实现以进行一些初始化

    do {
	while (!CheckRequest(&com)) {

	    IMediaSample *pSample;
<span style="white-space:pre">		</span>//输出Pin上得到一个空的Pin
	    HRESULT hr = GetDeliveryBuffer(&pSample,NULL,NULL,0);
	    if (FAILED(hr)) {
                Sleep(1);
		continue;	// go round again. Perhaps the error will go away
			    // or the allocator is decommited & we will be asked to
			    // exit soon.
	    }

	    // 子类必须实现的一个函数,填写Sample的实际内容
	    hr = FillBuffer(pSample);

	    if (hr == S_OK) {
		hr = Deliver(pSample);//往下一个filter发送数据
                pSample->Release();

                // downstream filter returns S_FALSE if it wants us to
                // stop or an error if it's reporting an error.
                if(hr != S_OK)
                {
                  DbgLog((LOG_TRACE, 2, TEXT("Deliver() returned %08x; stopping"), hr));
                  return S_OK;
                }

	    } else if (hr == S_FALSE) {
                // derived class wants us to stop pushing data
		pSample->Release();
		DeliverEndOfStream();
		return S_OK;
	    } else {
                // derived class encountered an error
                pSample->Release();
		DbgLog((LOG_ERROR, 1, TEXT("Error %08lX from FillBuffer!!!"), hr))
### 回答1: DirectShow 源代码是在 Microsoft 平台上提供的一套开源代码,旨在帮助开发人员构建流媒体应用程序。DirectShow 是一种多媒体框架,用于处理音频和视频。它可以提高应用程序的性能,使架构更加完整、安全,同时减少开发难度。DirectShow 由一组与 COM 相互作用的 Windows API (Win32) 组件组成,因此,这些组件可用于搭建任何语言的多媒体应用程序。DirectShow API 允许开发人员自由选择编写自己的过滤器以实现高效的处理过程。 DirectShow 过滤器提供了一个自定义的接口和一组工具,以协调多媒体数据的流转。过滤器将媒体数据从一端传输到另一端,并以均匀的速度进行处理。通过分离音频和视频,可以使媒体处理流程变得简单明了。过滤器也可用于编写插件,以实现从不同来源读取、写入、处理和传输媒体数据的功能。 总之,DirectShow 源代码提供了一个高度可定制和扩展的平台,使开发人员能够轻松地构建流媒体应用程序。使用 DirectShow 框架,可以大大提高应用程序的性能,同时简化开发难度和时间。 ### 回答2: DirectShow是一个在Windows上使用的Microsoft API,用于处理流媒体数据的采集、处理和播放。它涉及一组用于使用流处理组件之间进行交互的API和COM对象。 DirectShow API主要由四个组件构成:过滤器,插件,捕获设备和多媒体播放器。 DirectShow的源代码是指用于创建、操作和运行DirectShow过滤器的可执行源代码。它包括一组创建、操作和连接过滤器的API,可在应用程序级别进行控制。 DirectShow的源代码是Windows Media SDK的一部分,因此可以通过下载Windows Media SDK来获得源代码。 DirectShow的源代码提供了自定义过滤器和插件的能力,以便开发人员可以创建自己的过滤器和插件来满足特定的需求。因此,通过使用DirectShow的源代码,用户可以创建自己的媒体应用程序,以便满足特定的需求。 就产品开发资源来说,directshow可以说是极具价值的开源资源。它的应用范围覆盖了多种领域,比如音视频编码、解码、编辑、录制等。 广泛应用于视频会议,视频监控,智慧教育等领域。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值