首页 > 文库大全 > 精品范文库 > 13号文库

directshow的中文资料之设备列举和捕捉接口

directshow的中文资料之设备列举和捕捉接口



第一篇:directshow的中文资料之设备列举和捕捉接口

directshow的中文资料之设备列举和捕捉接口

这篇解释和示例如何通过DirectShow的接口去初始化和访问系统的硬件设备。代表性的,DirectShow应用程序使用下面类型的硬件。

音/视频捕捉卡

音频或视频回放卡

音频或视频压缩或解压卡(象MPEG解码器)

下面将以AV设备作参考。

如何列举设备

包括在DirectShow SDK中的接口,类,和例子提供了音/视频捕捉和回放的功能。因为文件源过滤器和filter graph manager处理了内在的工作,所有,添加捕捉功能到一个应用程序中,只需添加很少的代码。你可以通过列举系统硬件设备和得到设备列表完成特别的任务(例如:所有的视频捕捉卡的列表)。DirectShow自动为win32和Video for Windows 设备实例化过滤器。

要AV设备工作,首先,你必须检测当前系统存在的设备。ICreateDevEnum接口建立指定类型的列表。提供你需要的检测和设置硬件的功能。访问一个指定的设备有三步,详细的说明和代码如下:

建立系统硬件设备的列表

首先,申明一个列表指针,然后通过 CoCreateInstance 建立。CLSID_SystemDeviceEnum是我们想建立对象的类型,IID_ICreateDevEnum是接口的GUID。

ICreateDevEnum *pCreateDevEnum;

CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER,IID_ICreateDevEnum,(void**)&pCreateDevEnum);

其次,建立一个特别类型的硬件设备的列表(例如视频捕捉卡)

申明一个IEnumMoniker接口,并把他传给ICreateDevEnum::CreateClassEnumerator 方法。你就可以使用他访问新得到的列表了。

IEnumMoniker *pEnumMon;

pCreateDevEnum->CreateClassEnumerator([specify device GUID here]

&pEnumMon, 0);

最后,列举列表直到你得到你想要的设备为止。

如果先前的CreateClassEnumerator调用成功了,你可以用IEnumMoniker::Next得到设备。调用IMoniker::BindToObject建立一个和选择的device联合的filter,并且装载filter的属性(CLSID,FriendlyName, and DevicePath)。不需要为if语句的(1 == cFetched)困惑,在测试合法性之前,pEnumMon->Next(1, &pMon, &cFetched)方法会设置他为返回对象的数字(如果成功了为1)。

ULONG cFetched = 0;

IMoniker *pMon;

if(S_OK ==(pEnumMon->Next(1, &pMon, &cFetched))&&(1 == cFetched)){

pMon->BindToObject(0, 0, IID_IBaseFilter,(void **)&[desired interface here]);

好,现在你有了一个IMoniker指针,你可以添加设备的filter到filter graph。一旦你添加了filter,你就不需要IMoniker指针,设备列表,或系统设备列表。

pGraph->AddFilter([desired interface here], L“[filter name here]”);

pMon->Release();// Release moniker

} pEnumMon->Release();// Release the class enumerator}pCreateDevEnum->Release();实例:AMCap中的设备列表代码 AMCap例子中,把所有的接口指针和一些成员变量保存在一个全局结构gcap中了。定义如下: struct _capstuff {char szCaptureFile[_MAX_PATH];WORD wCapFileSize;// size in MegICaptureGraphBuilder *pBuilder;IVideoWindow *pVW;IMediaEventEx *pME;IAMDroppedFrames *pDF;IAMVideoCompression *pVC;IAMVfwCaptureDialogs *pDlg;IAMStreamConfig *pASC;// for audio capIAMStreamConfig *pVSC;// for video capIBaseFilter *pRender;IBaseFilter *pVCap, *pACap;IGraphBuilder *pFg;IFileSinkFilter *pSink;IConfigAviMux *pConfigAviMux;int iMasterStream;BOOL fCaptureGraphBuilt;BOOL fPreviewGraphBuilt;BOOL fCapturing;BOOL fPreviewing;BOOL fCapAudio;int iVideoDevice;int iAudioDevice;double FrameRate;BOOL fWantPreview;long lCapStartTime;long lCapStopTime;char achFriendlyName[120];BOOL fUseTimeLimit;DWORD dwTimeLimit;} gcap;例子用uIndex变量循环列举系统的硬件设备。BOOL InitCapFilters(){HRESULT hr;BOOL f;

UINT uIndex = 0;

MakeBuilder函数建立了一个filter graph builder(参考建立一个捕捉程序)。

f = MakeBuilder();

建立设备列表对象,得到ICreateDevEnum接口

ICreateDevEnum *pCreateDevEnum;

hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER,IID_ICreateDevEnum,(void**)&pCreateDevEnum);

建立一个特别类型的硬件设备的列表,类的ID是CLSID_VideoInputDeviceCategory。现在有了一个IEnumMoniker指针,可以访问捕捉设备的列表了。

IEnumMoniker *pEm;

hr = pCreateDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEm, 0);

pCreateDevEnum->Release();// We don't need the device enumerator anymore

pEm->Reset();// Go to the start of the

enumerated list

现在需要实际的设备了,调用IEnumMoniker::Next,然后用得到的指针pM调用IMoniker::BindToObject,绑定filter到设备。如果你不想建立联合的filter,使用

IMoniker::BindToStorage 代替IMoniker::BindToObject。

ULONG cFetched;

IMoniker *pM;// This will access the actual devices

gcap.pVCap = NULL;

while(hr = pEm->Next(1, &pM, &cFetched), hr==S_OK)

{

if((int)uIndex == gcap.iVideoDevice){ // This is the one we want.Instantiate it.hr = pM->BindToObject(0, 0, IID_IBaseFilter,(void**)&gcap.pVCap);

pM->Release();// We don't need the moniker pointer anymore

break;

}

pM->Release();

uIndex++;

}

pEm->Release();// We've got the device;don't need the

enumerator anymore

当有了设备后,通过接口指针去测量帧数,得到driver的名字,得到捕捉的尺寸(size)。在例子中,把每个指针都存储才gcap全局结构中了。, and get the capture size.AMCap stores each pointer in the gcap global structure.// We use this interface to get the number of captured and dropped frames

gcap.pBuilder->FindCaptureInterface(gcap.pVCap,IID_IAMDroppedFrames,(void **)&gcap.pDF);

// We use this interface to get the name of the driver

gcap.pBuilder->FindCaptureInterface(gcap.pVCap,IID_IAMVideoCompression,(void **)&gcap.pVC);

// We use this interface to set the frame rate and get the capture size

gcap.pBuilder->FindCaptureInterface(gcap.pVCap,IID_IAMVideoStreamConfig,(void **)&gcap.pVSC);

然后得到媒体的类型和显示窗口的大小去匹配视频格式的尺寸。

AM_MEDIA_TYPE *pmt;

gcap.pVSC->GetFormat(&pmt);// Current capture format

ResizeWindow(HEADER(pmt->pbFormat)->biWidth,HEADER(pmt->pbFormat)->biHeight);

DeleteMediaType(pmt);

现在,已经有了视频设备和他的相关信息,重复这个过程,得到音频设和他的信息并存储到全局机构中去。注意,这次是用参数CLSID_AudioInputDeviceCategory 调用ICreateDevEnum::CreateClassEnumerator。

hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER,IID_ICreateDevEnum,(void**)&pCreateDevEnum);

uIndex = 0;

hr = pCreateDevEnum->CreateClassEnumerator(CLSID_AudioInputDeviceCategory,&pEm, 0);

pCreateDevEnum->Release();

pEm->Reset();

gcap.pACap = NULL;

while(hr = pEm->Next(1, &pM, &cFetched), hr==S_OK)

{

if((int)uIndex == gcap.iAudioDevice){ // this is the one we want

hr = pM->BindToObject(0, 0, IID_IBaseFilter,(void**)&gcap.pACap);

pM->Release();

break;

}

pM->Release();

uIndex++;

}

pEm->Release();

AMCap also repeats the process of retrieving the format interface, this time for the audio device.hr = gcap.pBuilder->FindCaptureInterface(gcap.pACap,IID_IAMAudioStreamConfig,(void **)&gcap.pASC);

}

如何保持DirectShow Filter(Properties)道具

IPropertyBag 和 IPersistPropertyBag 接口存储和返回Properties的“bags”组。通过这些接口存储的Properties是可以持久保持的。同一个对象在不同的实例之间,他们保持一致。Filter可以存储他们的Properties(CLSID, FriendlyName, and DevicePath)。当一个filter存储完他的Properties之后,实例一个filter时,DirectShow会自动得到他们。添加功能到你的filter中,执行IPersistPropertyBag接口和他的方法。你可以用IPropertyBag::Read 方法装载filter Properties 到Win32 VARIANT 变量中,然后初始化输入输出pin。

下面的代码演示DirectShow的VfWCapture filter如何执行IPersistPropertyBag::Load方法的。记住:在执行期间,你的filter必须提供一个有效的IPropertyBag指针。

STDMETHODIMP CVfwCapture::Load(LPPROPERTYBAG pPropBag, LPERRORLOG

pErrorLog)

{

HRESULT hr;

CAutoLock cObjectLock(m_pLock);// Locks the object;automatically unlocks it in the destructor.if(m_pStream)// If the filter already exists for this stream

return E_UNEXPECTED;

VARIANT var;// VARIANT from Platform SDK

var.vt = VT_I4;// four-byte integer(long)

hr = pPropBag->Read(L“VFWIndex”, &var, 0);// VFWIndex is the private name used by the Vidcap Class Manager to refer to the VFW Capture filter

if(SUCCEEDED(hr))// If it read the properties successfully

{

hr = S_OK;// Defaults return value to S_OK

m_iVideoId = var.lVal;// Stores the specified hardware device number

CreatePins(&hr);// Inits the pins, replacing the return value if necessary

}

return hr;// Returns S_OK or an error value, if CreatePins failed(王朝网络

wangchao.net.cn)

第二篇:DirectShow的中文资料

Dshow采集视频

DirectShow的中文资料之设备列举和捕捉接口

这篇解释和示例如何通过DirectShow的接口去初始化和访问系统的硬件设备。代表性的,DirectShow应用程序使用下面类型的硬件。

音/视频捕捉卡音频或视频回放卡音频或视频压缩或解压卡(象MPEG解码器)

下面将以AV设备作参考。

如何列举设备

包括在DirectShow SDK中的接口,类,和例子提供了音/视频捕捉和回放的功能。因为文件源过滤器和filter graph manager处理了内在的工作,所有,添加捕捉功能到一个应用程序中,只需添加很少的代码。你可以通过列举系统硬件设备和得到设备列表完成特别的任务(例如:所有的视频捕捉卡的列表)。DirectShow自动为win32和Video for Windows 设备实例化过滤器。要AV设备工作,首先,你必须检测当前系统存在的设备。ICreateDevEnum接口建立指定类型的列表。提供你需要的检测和设置硬件的功能。访问一个指定的设备有三步,详细的说明和代码如下:

建立系统硬件设备的列表

首先,申明一个列表指针,然后通过 CoCreateInstance 建立。CLSID_SystemDeviceEnum是我们想建立对象的类型,IID_ICreateDevEnum是接口的GUID。

ICreateDevEnum*pCreateDevEnum;

CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, IID_ICreateDevEnum,(void**)&pCreateDevEnum);

其次,建立一个特别类型的硬件设备的列表(例如视频捕捉卡)

申明一个IEnumMoniker接口,并把他传给ICreateDevEnum::CreateClassEnumerator 方法。你就可以使用他访问新得到的列表了。IEnumMoniker *pEnumMon;

pCreateDevEnum->CreateClassEnumerator([specify device GUID here], &pEnumMon, 0);

最后,列举列表直到你得到你想要的设备为止。

如果先前的CreateClassEnumerator调用成功了,你可以用IEnumMoniker::Next得到设备。调用IMoniker::BindToObject建立一个和选择的device联合的filter,并且装载filter的属性(CLSID,FriendlyName, and DevicePath)。不需要为if语句的(1 == cFetched)困惑,在测试合法性之前,pEnumMon->Next(1, &pMon, &cFetched)方法会设置他为返回对象的数字(如果成功了为1)。ULONG cFetched = 0;

IMoniker *pMon;

if(S_OK ==(pEnumMon->Next(1, &pMon, &cFetched))&&(1 == cFetched))

{

pMon->BindToObject(0, 0, IID_IBaseFilter,(void **)&[desired interface here]);

好,现在你有了一个IMoniker指针,你可以添加设备的filter到filter graph。一旦你添加了filter,你就不需要IMoniker指针,设备列表,或系统设备列表。

pGraph->AddFilter([desired interface here], L“[filter name here]”);

pMon->Release();// Release moniker

}

pEnumMon->Release();// Release the class enumerator

}

pCreateDevEnum->Release();

实例:AMCap中的设备列表代码

AMCap例子中,把所有的接口指针和一些成员变量保存在一个全局结构gcap中了。

定义如下:

struct _capstuff {

charszCaptureFile[_MAX_PATH];

WORDwCapFileSize;// size in Meg

ICaptureGraphBuilder *pBuilder;

IVideoWindow*pVW;

IMediaEventEx*pME;

IAMDroppedFrames*pDF;

IAMVideoCompression*pVC;

IAMVfwCaptureDialogs *pDlg;

IAMStreamConfig*pASC;// for audio cap

IAMStreamConfig*pVSC;// for video cap

IBaseFilter*pRender;

IBaseFilter*pVCap, *pACap;

IGraphBuilder*pFg;

IFileSinkFilter*pSink;

IConfigAviMux*pConfigAviMux;

intiMasterStream;

BOOLfCaptureGraphBuilt;

BOOLfPreviewGraphBuilt;

BOOLfCapturing;

BOOLfPreviewing;

BOOLfCapAudio;

intiVideoDevice;

intiAudioDevice;

doubleFrameRate;

BOOLfWantPreview;

longlCapStartTime;

longlCapStopTime;

charachFriendlyName[120];

BOOLfUseTimeLimit;

DWORDdwTimeLimit;

} gcap;

例子用uIndex变量循环列举系统的硬件设备。

BOOL InitCapFilters()

{

HRESULT hr;

BOOL f;

UINT uIndex = 0;

f = MakeBuilder();//MakeBuilder函数建立了一个filter graph builder(参考建立一个捕捉程序)。

//建立设备列表对象,得到ICreateDevEnum接口

ICreateDevEnum *pCreateDevEnum;

hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, IID_ICreateDevEnum,(void**)&pCreateDevEnum);

建立一个特别类型的硬件设备的列表,类的ID是CLSID_VideoInputDeviceCategory。现在有了一个IEnumMoniker指针,可以访问捕捉设备的列表了。

IEnumMoniker *pEm;

hr = pCreateDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEm, 0);

pCreateDevEnum->Release();// We don't need the device enumerator anymore

pEm->Reset();// Go to the start of the enumerated list

现在需要实际的设备了,调用IEnumMoniker::Next,然后用得到的指针pM调用IMoniker::BindToObject,绑定filter到设备。如果你不想建立联合的filter,使用IMoniker::BindToStorage 代替IMoniker::BindToObject。

ULONG cFetched;

IMoniker *pM;// This will access the actual devices

gcap.pVCap = NULL;

while(hr = pEm->Next(1, &pM, &cFetched), hr==S_OK)

{

if((int)uIndex == gcap.iVideoDevice)

{

// This is the one we want.Instantiate it.hr = pM->BindToObject(0, 0, IID_IBaseFilter,(void**)&gcap.pVCap);

pM->Release();// We don't need the moniker pointer anymore

break;

}

pM->Release();

uIndex++;

}

pEm->Release();// We've got the device;don't need the enumerator anymore

当有了设备后,通过接口指针去测量帧数,得到driver的名字,得到捕捉的尺寸(size)。在例子中,把每个指针都存储才gcap全局结构中了。, and get the capture size.AMCap stores each pointer in the gcap global structure.// We use this interface to get the number of captured and dropped frames

gcap.pBuilder->FindCaptureInterface(gcap.pVCap, IID_IAMDroppedFrames,(void **)&gcap.pDF);

// We use this interface to get the name of the driver

gcap.pBuilder->FindCaptureInterface(gcap.pVCap, IID_IAMVideoCompression,(void **)&gcap.pVC);

// We use this interface to set the frame rate and get the capture size

gcap.pBuilder->FindCaptureInterface(gcap.pVCap, IID_IAMVideoStreamConfig,(void **)&gcap.pVSC);

然后得到媒体的类型和显示窗口的大小去匹配视频格式的尺寸。

AM_MEDIA_TYPE *pmt;

gcap.pVSC->GetFormat(&pmt);// Current capture format

ResizeWindow(HEADER(pmt->pbFormat)->biWidth, EADER(pmt->pbFormat)->biHeight);

DeleteMediaType(pmt);

现在,已经有了视频设备和他的相关信息,重复这个过程,得到音频设和他的信息并存储到全局机构中去。注意,这次是用参数CLSID_AudioInputDeviceCategory 调用ICreateDevEnum::CreateClassEnumerator。

hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, IID_ICreateDevEnum,(void**)&pCreateDevEnum);uIndex = 0;

hr = pCreateDevEnum->CreateClassEnumerator(CLSID_AudioInputDeviceCategory, &pEm, 0);

pCreateDevEnum->Release();

pEm->Reset();

gcap.pACap = NULL;

while(hr = pEm->Next(1, &pM, &cFetched), hr==S_OK)

{

if((int)uIndex == gcap.iAudioDevice)

{

// this is the one we want

hr = pM->BindToObject(0, 0, IID_IBaseFilter,(void**)&gcap.pACap);

pM->Release();

break;

}

pM->Release();

uIndex++;

}

pEm->Release();

// AMCap also repeats the process of retrieving the format interface, this time for the audio device.hr = gcap.pBuilder->FindCaptureInterface(gcap.pACap, IID_IAMAudioStreamConfig,(void **)&gcap.pASC);

}

如何保持DirectShow Filter(Properties)

IPropertyBag 和 IPersistPropertyBag 接口存储和返回Properties的“bags”组。通过这些接口存储的Properties是可以持久保持的。同一个对象在不同的实例之间,他们保持一致。Filter可以存储他们的Properties(CLSID, FriendlyName, and DevicePath)。当一个filter存储完他的Properties之后,实例一个filter时,DirectShow会自动得到他们。添加功能到你的filter中,执行IPersistPropertyBag接口和他的方法。你可以用IPropertyBag::Read 方法装载filter Properties 到Win32 VARIANT 变量中,然后初始化输入输出pin。下面的代码演示DirectShow的VfWCapture filter如何执行IPersistPropertyBag::Load方法的。记住:在执行期间,你的filter必须提供一个有效的IPropertyBag指针。

STDMETHODIMP CVfwCapture::Load(LPPROPERTYBAG pPropBag, LPERRORLOG pErrorLog)

{

HRESULT hr;

CAutoLock cObjectLock(m_pLock);// Locks the object;automatically unlocks it in the destructor.if(m_pStream)// If the filter already exists for this stream

return E_UNEXPECTED;

VARIANT var;// VARIANT from Platform SDK

var.vt = VT_I4;// four-byte integer(long)

/ VFWIndex is the private name used by the Vidcap Class Manager to refer to the VFW Capture filter

hr = pPropBag->Read(L“VFWIndex”, &var, 0);

if(SUCCEEDED(hr))// If it read the properties successfully

{

hr = S_OK;// Defaults return value to S_OK

m_iVideoId = var.lVal;// Stores the specified hardware device number

CreatePins(&hr);// Inits the pins, replacing the return value if necessary

}

return hr;// Returns S_OK or an error value, if CreatePins failed

}、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、DirectShow的使用:

(1):头文件和库要包含dshow.h头文件,并且链接Strmiids.lib和Quartz.lib库文件。

(2):初始化DirectShow程序开始的时候必须要初始化COM,包括CoInitialize和CoUninitialize。

(3):创建filter graph 每一个DirectShow程序必须创建一个filter graph,它表现为一个媒体文件的解码和播放的机构。Filter graph通过graph builders建立(IGraphBuilder),这个接口通过CoCreateInstance来建立。

(4):建立媒体控制 创建好一个可播放媒体文件的filter graph之后,你必须创建媒体的控制用来完成相关的基本操作,比方说播放或者停止等。这个可以通过CoCreateInstance建立IMediaControl接口来实现。

(5):创建和配置事件机制 你要想知道当文件播放停止,错误发生,用户终止等操作的发生。这样就必须使用IMediaEventEx接口,同样它通过CoCreateInstance建立。

(6):装载一个文件你必须建立一个filter graph用来播放文件。可以通过IGraphBuilder::RenderFile来实现。

(7):播放文件media control 接口可以被用来播放文件。

(8):处理媒体事件播放文件的同时,可能会发生许多的事件----文件可能要播放完了,文件可能会发生错误,用户可能会停止播放。为了通知你,会发送一个通用的消息给WndProc,IMediaEventEx接口将会立即获得这个消息。

(9):清除当你结束使用DirectShow时,你必须释放你使用的接口,并且卸载COM。DirectShow的系统组成:

DirectShow技术是建立在DirectDraw和DirectSound组件基础之上的,它通过DirectDraw对显卡进行控制以显示视频,通

过DirectSound对声卡进行控制以播放声音。DirectShow可提供高质量的多媒体流的捕获和回放功能;支持多种媒体格式,包括ASF(Advanced Systems Format),MPEG(Motion Picture Experts Group),AVI(Audio-Video Interleaved),MP3(MPEG Audio Layer-3)和WAV声音文件;可以从硬件上捕获媒体数据流;可以自动检测并使用视频和音频加速硬件。因此,DirectShow可以充分发挥媒体的性能,提高运行速度,可以简化媒体播放、媒体间的格式转换和媒体捕获等工作。同时,它还具有极大的可扩展性和灵活性,可以由用户自己创建组件,并将这个组件加入DirectShow结构中以支持新的格式或特殊的效果。

应用程序与DirectShow组件以及DirectShow所支持的软硬件之间的关系如图1所示:

2.1 过滤器(filter)

由图1可以看到,过滤器是DirectShow最基本的组成元件。过滤器是一个COM组件,是完成DirectShow处理过程的基本单元。DirectShow提供了一组标准的过滤器供应用程序使用,程序开发者也可以创建自定义的过滤器来扩充DirectShow的功能,但必须是以COM形式建立的。DirectX为用户提供了DirectShow基类库(DirectShow Base Class Library),用户自定义的过滤器都可以从基类库提供的基类和接口派生出来。

过滤器主要分为以下几种类型:

(1)源过滤器(source filter):源过滤器引入数据到过滤器图表中,数据来源可以是文件、网络、照相机等。不同的源过滤器处理不同类型的数据源。

(2)变换过滤器(transform filter):变换过滤器的工作是获取输入流,处理数据,并生成输出流。变换过滤器对数据的处理包括编解码、格式转换、压缩解压缩等。

(3)提交过滤器(renderer filter):提交过滤器在过滤器图表里处于最后一级,它们接收数据并把数据提交给外设。

(4)分割过滤器(splitter filter):分割过滤器把输入流分割成多个输出。例如,AVI分割过滤器把一个AVI格式的字节流分割成视频流和音频流。

(5)混合过滤器(mux filter):混合过滤器把多个输入组合成一个单独的数据流。例如,AVI混合过滤器把视频流和音频流合成一个AVI格式的字节流。

过滤器的这些分类并不是绝对的,例如一个ASF读过滤器(ASF Reader filter)既是一个源过滤器又是一个分割过滤器。

在DirectShow里,一组过滤器称为一个过滤器图表(filter graph)。过滤器图表用来连接过滤器以控制媒体流,它也可以将数据返回给应用程序,并搜索所支持的过滤器。过滤器有三种可能的状态:运行、停止和暂停。暂停是一种中间状态,停止状态到运行状态必定经过暂停状态。暂停可以理解为数据就绪状态,是为了快速切换到运行状态而设计的。在暂停状态下,数据线程是启动的,但被提交过滤器阻塞了。通常情况下,过滤器图表中所有过滤器的状态是一致的。

2.2 引脚(pin)

过滤器可以和一个或多个过滤器相连,连接的接口也是COM形式的,称为引脚。过滤器利用引脚在各个过滤器间传输数据。每个引脚都是从Ipin这个COM对象派生出来的。每个引脚都是过滤器的私有对象,过滤器可以动态的创建引脚,销毁引脚,自由控制引脚的生存时间。引脚可以分为输入引脚(Input pin)和输出引脚(Output pin)两种类型,两个相连的引脚必须是不同种类的,即输入引脚只能和输出引脚相连,且连接的方向总是从输出引脚指向输入引脚。

过滤器之间的连接(也就是引脚之间的连接),实际上是连接双方媒体类型(Media Type)协商的过程。连接的大致过程为:如果调用连接函数时已经指定了完整的媒体类型,则用这个媒体类型进行连接,成功与否都结束连接过程;如果没有指定或不完全指定了媒体类型,则进入下面的枚举过程--枚举欲连接的输入引脚上所有的媒体类型,逐一用这些媒体类型与输出引脚进行连接(如果连接函数提供了不完全媒体类型,则要先将每个枚举出来的媒体类型与它进行匹配检查),如果输出引脚也接受这种媒体类型,则引脚之间的连接宣告成功;如果所有输入引脚上枚举的媒体类型,输出引脚都不支持,则枚举输出引脚上的所有媒体类型,并逐一用这些媒体类型与输入引脚进行连接,如果输入引脚接受其中的一种媒体类型,则引脚之间的连接宣告成功;如果输出引脚上的所有媒体类型,输入引脚都不支持,则这两个引脚之间的连接过程宣告失败。过滤器与引脚连接如图2所示。

2.3 媒体类型(Media Type)

媒体类型是描述数字媒体格式的一种通用的可扩展方式。两个过滤器相连时,必须使用一致的媒体类型,否则这两个过滤器就不能相连。媒体类型能识别上一级过滤器传送给下一级过滤器的数据类型,并对数据进行分类。

实际在很多应用程序中,用户根本不需要担心媒体类型的问题,DirectShow会处理好所有的细节。但有些应用程序需要对媒体类型进行操作。媒体类型一般可以有两种表示:AM_MEDIA_TYPE和CMediaType。前者是一个结构,后者是从这个结构继承过来的类。

每个AM_MEDIA_TYPE由三部分组成:Major type、Subtype和Format type。这三个部分都使用GUID(全局唯一标识符)来唯一标示。Major type主要定性描述一种媒体类型,这种媒体类型可以是视频、音频、比特数据流或MIDI数据等等;Subtype进一步细化媒体类型,如果是视频的话可以进一步指定是RGB-24,还是RGB-32,或是UYVY等等;Format type则用一个结构更进一步细化媒体类型。如果媒体类型的三个部分都指定了某个具体的GUID值,则称这个媒体类型是完全指定的;如果媒体类型的三个部分中有任何一个值是GUID_NULL,则称这个媒体类型是不完全指定的。GUID_NULL具有通配符的作用。

2.4 过滤器图表管理器(Filter Graph Manager)

DirectShow通过过滤器图表管理器来控制过滤器图表中的过滤器。过滤器图表管理器是COM 形式的,它的功能有:协调过滤器间的状态转变;建立参考时钟;把事件(event)传送给应用程序;为应用程序提供建立过滤器图表的方法。

一些常用的过滤器图表管理器接口如下:

IGraphBuilder:为应用程序提供创建过滤器图表的方法。

IMediaControl:提供控制过滤器图表中多媒体数据流的方法,包括运行、暂停和停止。IMediaEventEx:继承自IMediaEvent接口,处理过滤器图表的事件。

IVideoWindow:用于设置多媒体播放器窗口的属性,应用程序可以用它来设置窗口的所有者、位置和尺寸等属性。

IBasicAudio:用于控制音频流的音量和平衡。

IBasicVideo:用于设置视频特性,如视频显示的目的区域和源区域。

IMediaSeeking:提供搜索数据流位置和设置播放速率的方法。

IMediaPosition:用于寻找数据流的位置。

IVideoFrameStep:用于步进播放视频流,可使DirectShow应用程序,包括DVD播放器一次只播放一帧视频。

2.5 过滤器图表中的数据流动

当用户要创建自定义的过滤器时,就需要了解媒体数据是如何在过滤器图表中传输的。为了在过滤器图表中传送媒体数据,DirectShow过滤器需要支持一些协议,称之为传输协议(transport)。相连的过滤器必须支持同样的传输协议,否则不能交换媒体数据。

大多数的DirectShow过滤器把媒体数据保存在主存储器中,并通过引脚把数据提交给其它的过滤器,这种传输称为局部存储器传输(local memory transport)。虽然局部存储器传输在DirectShow中最常用,但并不是所有的过滤器都使用它。例如,有些过滤器通过硬件传送媒体数据,引脚只是用来提交控制信息,如IOverlay接口。

DirectShow为局部存储器传输定义了两种机制:推模式(push model)和拉模式(pull model)。在推模式中,源过滤器生成数据并提交给下一级过滤器。下一级过滤器被动的接收数据,完成处理后再传送给再下一级过滤器。在拉模式中,源过滤器与一个分析过滤器相连。分析过滤器向源过滤器请求数据后,源过滤器才传送数据以响应请求。推模式使用的是IMemInputPin接口,拉模式使用IAsyncReader接口,推模式比拉模式要更常用。利用DirectShow开发简单媒体播放器

本节介绍基于DirectShow开发简单媒体播放器的关键步骤。

3.1 初始化DirectShow

由于DirectShow的组件都是以COM形式存在的,因此首先要调用CoInitializeEx函数来初始化COM库,嵌入所有的动态链接库和资源。否则,所有对QueryInterface的调用都会失败。

3.2 创建过滤器图表管理器接口

首先申明并初始化所需的接口:

// DirectShow interfaces

IGraphBuilder *pGB = NULL;

IMediaControl *pMC = NULL;

IMediaEventEx *pME = NULL;

IVideoWindow *pVW = NULL;

IBasicAudio *pBA = NULL;

IBasicVideo *pBV = NULL;

IMediaSeeking *pMS = NULL;

IMediaPosition *pMP = NULL;

IVideoFrameStep *pFS = NULL;

然后实例化一个过滤器图表管理器,并查询各接口:

// Get the interface for DirectShow's GraphBuilder

CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,IID_IGraphBuilder,(void **)&pGB);

// QueryInterface for DirectShow interfaces

pGB->QueryInterface(IID_IMediaControl,(void **)&pMC);

pGB->QueryInterface(IID_IMediaEventEx,(void **)&pME);

pGB->QueryInterface(IID_IMediaSeeking,(void **)&pMS);

pGB->QueryInterface(IID_IMediaPosition,(void **)&pMP);

// Query for video interfaces, which may not be relevant for audio files

pGB->QueryInterface(IID_IVideoWindow,(void **)&pVW);

pGB->QueryInterface(IID_IBasicVideo,(void **)&pBV);

// Query for audio interfaces, which may not be relevant for video-only files

pGB->QueryInterface(IID_IBasicAudio,(void **)&pBA);

3.3 创建过滤器图表

应用DirectShow创建过滤器图表时,用户完全不需要操心系统使用了哪一类过滤器以及过滤器是怎样连接的。只要调用IGraphBuilder::RenderFile函数,就可以建成一个完整的过滤器图表。

// Have the graph builder construct its the appropriate graph automatically

pGB->RenderFile(wFile, NULL);

创建成功后,过滤器图表就可以用来播放多媒体文件了。DirectShow调用IMediaControl::Run函数来播放媒体文件。// Run the graph to play the media file

pMC->Run();

3.4 使用DirectShow的事件响应机制

DirectShow的事件响应机制是过滤器图表管理器与用户进行交互的接口,DirectShow处理的可以是一些事先可以预期的事件,比如数据流的结束;也可以是一些无法预期的错误。有的事件可以由过滤器图表管理器自己处理,但如果过滤器图表管理器自己无法处理这些事件,它就把事件的通知放在事件队列里。用户程序就可以通过IMediaEventEx接口得到事件,并对它做出相应的处理。

3.5 清除DirectShow

在程序结束时必须调用Release函数释放DirectShow的接口指针,并调用CoUninitialize函数来卸载COM库,释放所有的动态链接库和资源。结束语

应用DirectX的组件DirectShow进行多媒体应用程序的开发需了解多方面的知识,但在很多应用中利用DirectShow的特性可以减少工作量并能获得非常高的运行效率。在Visual C++ 6.0的开发环境中利用DirectShow开发的简单媒体播放器,具有随机播放、暂停和调整播放速率等功能,且可以播放多种媒体文件,播放效果非常流畅。因此,基于DirectShow开发多媒体应用程序的方法简单高效,是一种值得推荐的方法。

第三篇:DirectShow重要接口

DirectShow重要接口

DirectShow 的重要接口

DirectShow采用了COM标准,所以很多重要的功能都是通过COM接口来完成。下面就列举一些重要的DirectShow的接口。

(1)IGraphBuilder接口

用于构造Filter Graph的接口,建立和管理一系列的Filter,过滤和处理源媒体流。

(2)IMediaControl接口

用于控制多媒体流在过滤器图表中的流动,如流的启动和停止。

(3)IMediaEvent接口

用于捕获播放过程中发生的事件,并通知应用程序,如EC_COMPLETE等。

(4)IVideoWindow接口

用于控制视频窗口的属性。

(5)IMeadiaSeeking接口

用于查找媒体的接口,定位流媒体,控制多媒体数据播放提供精确控制。

(6)IBaseFilter接口

从ImediaFilter接口继承,用来定义一个具体的过滤器指针,并对多媒体数据进行处理。

(7)IPin接口

用于管理两个过滤器之间的Pin,从而连接过滤器。

(8)IsampleGrabberCB接口

是Sample Grabber过滤器的一个接口,用于当流媒体数据通过过滤器时进行采样以获得帧图象。

用DirectShow来使用摄像头,一般要求摄像头的驱动是WDM格式的,当然,一些比较老的驱动格式DirectShow也可支持。在DirectShow中,有一个Sample Grabber过滤器,它是一个可以被插入流的过滤器,它有自己的缓冲,存放采样。我们就可以用它来从一个视频文件中简单的扑获一桢。DirectShow通过图形过滤管理器(Filter Graph Manager)来与上层应

用程序和下层的驱动进行联系。DirectShow通过捕获过滤器(Capture Filter)来支持对摄像头的捕获,一个捕获过滤器有多个插口(pin),其中的预览(preview)插口可用来进行显示祯图象。

1、创建图形过滤管理器Filter Graph

如上面原理所述,首先要创建Filter Graph:

CComPtr< IGraphBuilder > m_pGraph;

hr=m_pGraph.CoCreateInstance(CLSID_FilterGraph);

2、连接设备

还要创建系统枚举器组件对象:

CComPtr<ICreateDevEnum>

pCreateDevEnum;pCreateDevEnum.CoCreateInstance(CLSID_SystemDeviceEnum);

然后使用接口方法CreateClassEnumerator()为指定的Filter注册类型目录创建一个枚举器,并获得IenumMoniker接口:

CComPtr< IEnumMoniker > pEm;

pCreateDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEm, 0);

接着在调用BindToObject()以后,可以将设备标识生成一个DirectShow Filter,将其加到Filter Graph中就可以参与工作了。

CComPtr< IMoniker > pM;

CComPtr< IPropertyBag > pBag;

hr=pM->BindToStorage(0,0,ID_IPropertyBag,(void**)&pBag);

3、创建Sample Grabber过滤器

CComPtr< ISampleGrabber > m_pGrabber

hr=m_pGrabber.CoCreateInstance(CLSID_SampleGrabber);

当创建好SampleGrabber以后,在Sample Grabber 过滤器连接到别的过滤器之前你必须配置它。然后查询IsampleGrabber接口,还要设置流媒体类型:

m_pGrabber->SetMediaType();

可以仅仅指定主媒体类型;或者主类型加子类型;或者主类型,子类型和类型格式。然后就把它加载到FilterGraph中去:

m_pGraph->AddFilter(pGrabBase,“Grabber”);

4、查找Filter Graph 的Pin并完成后续连接。

接下来就可以通过调用IGraphBuilder 的FindPin()接口来查找过滤管理器中的Pin接口,并通过ICaptureGraphBuilder2 中的接口RenderStream()来完成后续的连接。

hr=pCGB2->FindPin(pCap,PINDIR_OUTPUT,&PIN_CATEGORY_VIDEOPORT, NULL,FALSE,0,&pVPPin);

hr=pCGB2->RenderStream(&PIN_CATEGORY_CAPTURE,&MEDIATYPE_Video, pCap,pGrabBase,pRenderer);

5、获取流媒体类型并运行

通过GetConnectedMediaType()获取连接流媒体的类型以后,我们可以通过

IsampleGrabberCB类的接口BufferCB()来把视频的数据拷贝到自定义的缓冲区中,然后通过在缓冲区的拷贝进行视频到图象数据的拷贝。最后运行﹕

CComQIPtr<IMediaControl,&IID_IMediaControl > pControl = m_pGraph;hr = pControl->Run();

第四篇:directshow音频捕捉

现在的所谓多媒体电脑一般都会有声卡(软声卡或硬声卡),有声卡就能进行音频的捕捉。大家一定熟悉Windows自带的附件“录音机”程序,可以通过麦克风进行录音,最终生成一个Wave文件。读完本文之后,你就会发现,自己使用DirectShow写一个音频捕捉的应用程序,原来也是这么的容易!

大家知道,DirectShow对硬件的支持是通过特定的包装Filter来实现的。声卡使用的是Audio Capture Filter,Filter内部使用以waveIn开头的一套API实现(如waveInOpen等)。运行GraphEdit,插入Filter时,在“Audio Capture Sources”目录下,我们就能看到所有代表本地机器上的声卡的各个Filter(有的机器装了几张声卡,这里就会有几个Filter)。在Filter Graph中加入这个Filter,我们发现这个Filter有很多Input pin,如Line In、CD Audio、Microphone、Stereo Mix等等;有一个Capture output pin。需要说明的是,在Filter Graph中,这些Input pin并没有真正的数据流入,它们只是声卡的各个输入端子的象征性表示;所以这些Input pin永远也不用连接。

下面我们来看一下如何创建一个音频捕捉程序。首先,当然是加入一个Audio Capture Filter。大家知道,DirectShow加入一个硬件Filter,都是要靠“枚举”;声卡Filter也不例外。代表声卡的Filter都注册在CLSID_AudioInputDeviceCategory目录下,使用系统设备枚举器枚举这个目录,就能发现我们想要创建的声卡对象。(如何枚举这里就不再赘述了。)当成功加入声卡Filter后,接下去的问题就是要将这个Filter与其他Filter相连。比如,我们想捕捉生成一个Wave文件,那么我们还需加入一个Wave Dest Filter和一个File Writer Filter,然后依次将它们相连。需要说明的是,Wave Dest Filter是微软DirectX SDK带的一个例子,在samplesMultimediaDirectShowFiltersWavDest目录下,我们必须首先编译这个例子并且注册这个Filter;这个Filter的功能是,当我们结束捕捉时,往Wave文件中写入一个文件头信息。下图是在GraphEdit中的Filter连接图:

下面是一段创建音频捕捉程序的框架代码,可供参考:

void BuildAudioCaptureGraph(void)// Warning!No error checking here.{

IBaseFilter *pSrc = NULL,*pWaveDest = NULL,* pWriter = NULL;

IFileSinkFilter *pSink= NULL;

IGraphBuilder *pGraph;

// Create the Filter Graph Manager.CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder,(void**)&pGraph);

// Add the audio capture filter.FindAudioCapture(&pSrc);// Assume that this function enumerates

// audio capture devices and picks one.pGraph->AddFilter(pSrc, L“Capture”);

// Add the WavDest and the File Writer.AddFilterByClsid(pGraph, L“WavDest”, CLSID_WavDest, &pWavDest);

AddFilterByClsid(pGraph, L“File Writer”, CLSID_FileWriter, &pWriter);

// Set the file name.pWriter->QueryInterface(IID_IFileSinkFilter,(void**)&pSink);

pSink->SetFileName(L“C:MyWackyWav.wav”, NULL);

// Hook everything up.ConnectTwoFilters(pGraph, pSrc, pWavDest);

ConnectTwoFilters(pGraph, pWavDest, pWriter);

}

当然,在进行音频捕捉的同时,我们还可以实时监听音频源的输入。如下示意图:

我们在Audio Capture Filter后面接了一个Infinite Pin Tee,这个Filter能够将一个Input pin输入的数据,复制成多份,分别通过各个Output pin发送出去。(这个Filter也是微软DirectX SDK带的一个例子,在samplesMultimediaDirectShowFilters InfTee目录下。)我们看到Tee Filter的一支连到了DirectSound Renderer,可以将声音放在声卡上输出。

创建音频捕捉的应用程序很简单吧!下面,我们还要来讨论一下音频捕捉前可能用到的一些参数设置。在声卡Filter的每个Input pin上,我们都可以得到IAMAudioInputMixer这个接口。通过这个接口,我们可以设置各个输入端子的音频属性,如进行音频合成时是否允许某个输入端子的音频参与混合、音频输入的音量,还有Treble、Bass等等。另外,在Filter上也可以得到IAMAudioInputMixer接口,这时调用接口方法就可以统一控制各个输入端子的属性。音频捕捉,还可以设置的是音频的采样频率以及声音的具体格式(8Bits或16Bits,单声道或双声道)。我们可以通过Capture output pin的IAMStreamConfig来完成。下面的代码可供参考:

HRESULT hr = pCapturePin->QueryInterface(IID_IAMStreamConfig,(void **)&pCfg);// Read current media type/format

AM_MEDIA_TYPE *pmt={0};

hr = pCfg->GetFormat(&pmt);

if(SUCCEEDED(hr))

{

// Fill in values for the new format

WAVEFORMATEX *pWF =(WAVEFORMATEX *)pmt->pbFormat;

pWF->nChannels =(WORD)nChannels;

pWF->nSamplesPerSec = nFrequency;

pWF->nAvgBytesPerSec = lBytesPerSecond;

pWF->wBitsPerSample =(WORD)(nBytesPerSample * 8);

pWF->nBlockAlign =(WORD)(nBytesPerSample * nChannels);

// Set the new formattype for the output pin

hr = pCfg->SetFormat(pmt);

DeleteMediaType(pmt);

}

// Release interfaces

pCfg->Release();

最后,还要提到的一点,也是音频捕捉比较特殊的地方:我们可以通过Capture output pin上的IAMBufferNegotiation接口,改变音频捕捉缓冲的大小,以减少声音播放的延迟。默认情况下,Audio Capture Filter使用0.5秒钟的缓冲。对于一些特殊的应用,这么大的缓冲是没有必要的,带来的延迟也比较大。一般,缓冲设置成能够容纳80毫秒的数据已经很可靠;甚至30-40毫秒也已经足够了。但是也不能太小,否则会影响到音频捕捉的效率,使音质受到损害。下面的代码设置音频捕捉的缓冲大小,可供参考:

pCapturePin->QueryInterface(IID_IAMBufferNegotiation,(void **)&pNeg);

// Set the buffer size based on selected settings

ALLOCATOR_PROPERTIES prop={0};

prop.cbBuffer = lBufferSize;

prop.cBuffers = 6;

prop.cbAlign = nBytesPerSample * nChannels;

hr = pNeg->SuggestAllocatorProperties(&prop);

pNeg->Release();

以上,我们讲述了音频捕捉程序的创建过程,以及一些捕捉参数的设置方法。相信大家对于如何写音频捕捉程序已经有了自己的认识。音频捕捉直接得到的是PCM数据,根据需要,我们还可以对其进行压缩,比如用Mp3格式(微软提供了一个免费的Mp3 Encoder)、AC3格式等等;压缩后数据量更少,可以符合很多场合的应用。

第五篇:中文资料

中文资料

建筑节能

1.节能住宅的概念

随着能源危机的出现,越来越多的开发商开始重视节能住宅。节能住宅需要通过对建筑的合理设计、合理选材,最大限度的把室内自然温度控制在人体舒适温度范围内,从而为居住者提供健康、舒适、环保的居住空间,降低建筑物的运行能耗。

2.国外节能已成风尚

在国外,建筑师采用多种形式和方法来节能:

(1)资源回收利用:日本1997年建成了一栋实验型“健康住宅”。除了整个住宅尽可能选对人体无害的建筑材料外,墙体还被设计成双重结构,每个房间建有通风口,整个房屋系统的空气采用全热交换器和除湿机进行循环。全热交换器能够有效地回收热量并加以再次利用,其过滤器可有效地收集空气中细小的尘埃,从而能够抑制霉菌等过敏生物繁殖。这种资源的回收利用,不仅变废为宝,而且减少了环境污源,节约了能源。

(2)新能源开发利用:德国建筑师建造了一座能跟踪阳光的太阳房屋。房屋被安装在一个圆盘底座上,由一个小型太阳能电动机带动一组齿轮。房屋底座在环形轨道上以每分钟转动3cm的速度随太阳旋转。当太阳落山以后,该房屋便反向转动,回到起点位置。它跟踪太阳所消耗的电力仅为房屋太阳能发电功率的1%,而所吸收的太阳能则相当于一般不能转动的太阳能房屋的2倍。

3.中国建筑能耗基本情况

我国的建筑能耗量约占全国总用能量的1/4,居耗能首位。近年来我国建筑业得到了快速的发展,需要大量的建造和运行使用能源,尤其是建筑的采暖和空调耗能。据统计,1994年全国仅住宅建筑能耗在基本上供热水的情况下为1.54×108t标准煤,占当年全社会能源消耗总量12.27×109t标准煤的12.6%。

中文资料

目前每年城镇建筑仅采暖一项需要耗能1.3×108t标准煤,占全国能源消费总量的11.5%左右,占采暖区全社会能源消费的20%以上,在一些严寒地区,城镇建筑能耗高达当地社会能源消费的50%左右。与此同时,由于建筑供暖燃用大量煤炭等矿物能源,使周围的自然与生态环境不断恶化。在能源的利用过程中,化石类燃料燃烧时排放到大气的污染物中,99%的氮氧化物、99%的CO、91%的SO2、78%的CO2、60%的粉尘和43%的碳化氢是化石类燃料燃烧时产生的,其中煤燃烧产生的占大多数。燃煤产生的大气污染物中SO2占87%、氮氧化物占67%,CO2占71%,烟尘占60%。由于我国是主要以煤而不是以油、气等优质能源作为主要能源消耗的国家,每年由于燃烧矿物燃料向地球大气排放的二氧化碳仅次于美国居世界第二,预计到2020年,中国将取代美国成为世界二氧化碳排放第一大国。因此,中国对于全球气候变暖承担着重大的责任,而作为耗能大户的建筑,其节能也就成为关系国计民生的重大问题。

4.住宅设计最基本的节能意识

新疆冬季严寒漫长,因此,住宅建筑设计中,主要空间朝向南,或向南偏东,或向南偏西,历来被认为是合理的设计,这是最基本的节能意识在住宅建筑设计中的应用。在我国的大部分冬冷夏热地区,住宅的总体规划和单体设计中,为住宅的主要空间争取良好朝向,满足冬季的日照要求,充分利用天然能源,无疑是最基本的改善住宅室内热环境的设计,是最基本的。

5.节能设计思路

5.1建造内保温复合节能墙体

复合节能墙体通常由绝热材料与传统墙材料或某些新型墙材料复合而成。如果绝热材料复合在建筑物外墙的内侧,则称为内保温复合墙体。

(1)体结构层:系指混凝土现浇或预制品的外墙,内浇外砌或砖混结构的外砖墙。以及诸如承重多孔砖外墙等其他承重外墙。

中文资料

(2)空气层:空气在0℃时导热系数为0.024 W/(m·k),20℃±5℃时为0.025 W/(m·k),200℃的情况下仍有0.0384 W/(m·k)。由此可见,空气也是一种优良的保温材料。因此,在建筑物中常用材料围成的空气隔离层,不但可以保温隔热。而且具有切断液态水分的毛细渗透、防止保温材料受潮的功能,因为一般外侧墙有吸水能力,而其内表面常因温度低而出现的冷凝水。可被结构材料吸入,且不断向室外转移和散发。

(3)保温隔热层:这是节能墙体的主要功能部分,常用绝热材料可分为有机、无机 金属等三大类。出于导热系数、抗压强度、蒸汽渗透率、燃烧性能等方面的考虑。此处选用挤塑型聚苯板(XPS)为保温材料。

玻璃幕墙是指由支承结构体系与玻璃组成的、可相对主体结构有一定位移能力、不分担主体结构所受作用的建筑外围护结构或装饰结构。有单层和双层玻璃的墙体。反光绝缘玻璃厚6毫米,墙面自重约40kg/㎡,有轻巧美观、不易污染、节约能源等优点。幕墙外层玻璃的里侧涂有彩色的金属镀膜,从外观上看整片外墙犹如一面镜子,将天空和周围环境的景色映入其中,光线变化时,影像色彩斑斓、变化无穷。在光线的反射下,室内不受强光照射,视觉柔和。中国1983年首次在北京长城饭店工程中采用。

去过美国纽约的人大凡会被其繁华的都市风貌所折服,那高耸入云的摩天大楼蔚为壮观,而其通体的玻璃幕墙映衬出空明的蓝天和飘舞的白云,更为之增添了绚丽的色彩。那么,玻璃幕墙是怎么做成的呢?玻璃幕墙是指作为建筑外墙装潢的镜面玻璃,它是在浮法玻璃组成中添加微量的Fe、Ni、Co、Se等,并经钢化制成颜色透明板状玻璃,它可吸收红外线,减少进入室内的太阳辐射,降低室内温度。它既能像镜子一样反射光线,又能像玻璃一样透过光线。

现代化高层建筑的玻璃幕墙还采用了由镜面玻璃与普通玻璃组合,隔层充入干燥空气的中空玻璃。中空玻璃有两层和三层之分,两层中空玻璃由两层玻璃加密封框架,形成一个夹层空间;三层玻璃则是由三层玻璃构成两个夹层空间。中空玻璃具有隔音、隔热、防结霜、防潮、抗风压强度大等优点。据测量,当室外温度为-10℃时,单层玻璃窗前的温度为-2℃,而使用三层中空玻璃的室内温度为13℃。而在夏天,双层中空玻璃可以挡住90%的太阳辐射热。阳光

中文资料

依然可以透过玻璃幕墙,但晒在身上大多不会感到炎热。使用中空玻璃幕墙的房间可以做到冬暖夏凉,极大地改善了生活环境。

5.2分类与构成

(1)明框玻璃幕墙是金属框架构件显露在外表面的玻璃幕墙。它以特殊断面的铝合金型材为框架,玻璃面板全嵌入型材的凹槽内。其特点在于铝合金型材本身兼有骨架结构和固定玻璃的双重作用。

(2)隐框玻璃幕墙

隐框玻璃幕墙的金属框隐蔽在玻璃的背面,室外看不见金属框。隐框玻璃幕墙又可分为全隐框玻璃幕墙和半隐框玻璃幕墙两种。隐框玻璃幕墙的构造特点是:玻璃在铝框外侧,用硅酮结构密封胶把玻璃与铝框粘结。幕墙的荷载主要靠密封胶承受。

(3)点式玻璃幕墙

点式玻璃幕墙是近年来新出现的一种支承方式。但一经出现,在城市发展很快。下面对这种较新型的支承方式作一介绍。

5.3点式玻璃幕墙

5.3.1点式玻璃幕墙的分类

按照支承结构的不同方式,点式玻璃幕墙在形式上可分为以下几种:(1)金属支承结构点式玻璃幕墙这是目前采用最多的一种形式,它是用金属材料做支承结构体系,通过金属连接件和紧固件将面玻璃牢固地固定在它上面,十分安全可靠。充分利用金属结构的灵活多变以满足建筑造型的需要,人们可以透过玻璃清楚地看到支承玻璃的整个结构体系。玻璃的晶莹剔透和金属结构的坚固结实,“美”与“力”的体现。增强了“虚”、“实”对比的效果。(2)全玻璃结构点式玻璃幕墙通过金属连接件及紧固件将玻璃支承结构(玻璃肋)与面玻璃连成整体,成为建筑围护结构。施工简便造价低,玻璃面和肋面

中文资料

构成开阔的视野,使人赏心悦目,建筑物室内、外空间达到最大程度的视觉交融。

(3)拉杆(索)结构点式玻璃幕墙采用不锈钢拉杆或用与玻璃分缝对应拉索做成幕墙的支承结构。玻璃通过金属连接件与其固定。在建筑中充分运用加工的精度,使构件均为受拉杆件,因此,施工时要加以预应力,这种柔性连接可降低震动时玻璃的破损率。

5.3.2建筑点式玻璃幕墙的主要组成部分

(1)支承体系 支承体系是将面玻璃所受的各种荷载直接传递到建筑主体结构上。因此,它是主要受力构件,一般是根据承受的荷载大小和建筑造型来结构形式和材料,如玻璃肋、不锈钢立柱、铝型材柱或加上适当的防腐、防绣的钢筋架、钢立柱及不锈钢拉杆(索)等。(2)金属连接件

金属连接件包括固定件和扣件。固定件通常用不锈普通钢铸造而成,而扣件则是不锈钢机加工件。

金属连接件是建筑点式技术的精华所在。它把面玻璃固定在支承结构上不仅产生玻璃孔边缘附加应力,而且能够允许少量的位移来调节由于建筑安装带来的施工误差,同时还有减震措施以提高抗震能力,因此设计时考虑的因素是多方面的。

(3)金属连接件还产生显著的装饰效果,因此它除满足功能上的要求之外,还要有优美的造型设计和精细的加工制造,起“画龙点睛”的作用。

5.3.3玻璃

建筑点式玻璃幕墙所用的玻璃,由于钻孔而导致玻璃强度降低约30%,因此建筑点式玻璃幕墙必须采用强度较高的钢化玻璃(钢化玻璃的抗冲击强度是浮法玻璃的3-5倍,抗弯强度是浮法玻璃的2-5倍)注,钢化玻璃另一个重要特性是使用安全,在遇到较大外力而破坏时产生无锐角的细小碎块(俗称“玻璃雨”),不易伤人。

中文资料

当地处北方的建筑物或对保温隔热有较高要求的建筑物,往往采用中空玻璃,它是在两片玻璃之间有一干燥的空气层或惰性气体层,中空玻璃能大幅度提高保温隔热性能的原因是玻璃的传热系数K值为0.8w/(m2·K),而空气的K值为0.03w/(m2·K),惰性气体就更低了。由于人口的增加,工业的发展,生活水平的提高,能源的消耗也就急剧增加,能源危机迫在眉睫。因此,各行各业提出了节能的要求。电能也就成为民用建筑电气设计的焦点。

6.建筑电气设计节能的原则

(1)满足建筑物的功能

即满足照明的照度、色温、显色指数;满足舒适性空调的温度及新风量,也就是舒适卫生;满足上下、左右的运输通道畅通无阻;满足特殊工艺要求,如娱乐场所的一些电气设施的用电,展厅的工艺照明及电力用电等。

(2)考虑实际经济效益

节能应按国情考虑实际经济效益,不能因为节能而过高地消耗投资,增加运行费用。而是应该让增加的部分投资,能在几年或较短的时间内用节能减少下来的运行费用进行回收。

(3)节省无谓消耗的能量

节能的着眼点,应是节省无谓消耗的能量。首先找出哪些地方的能量消耗是与发挥建筑物功能无关的,再考虑采取什么措施节能。如变压器的功率损耗,传输电能线路上的有功损耗都是无用的能量损耗,又如量大面广的照明容量,宜采用先进技术使其能耗降低。

因此,节能措施也应贯彻实用、经济合理、技术先进的原则。

7.提高系统的功率因数

提高系统的功率因数,减少无功在线路上传输,以达到节能的目的。

中文资料

为什么常提到负荷平稳的电动机可采用就地补偿,因为负荷变动时电机端电压也变化,使电容器没有放完电又充电,这时电容器会产生无功浪涌电流,使电机易产生过电压而损坏。因此,断续负载,如电梯、自动扶梯、自动步行道等不应在电动机端加装补偿电容器;另外,如星三角起动的异步电动机也不能在电动机端加装补偿电容器,因为它起动过程中有开路闭路瞬时转换,使电容器在放电瞬间又充电,也会使电机过电压而损坏。

在民用建筑中应改变电容器集中安装的做法,对容量超过10KW的风机、水泵、传送带等电动机端设置就地补偿装置,空调主机及冷冻泵等常在其附近设专用变配电所,可以集中补偿,但若供电距离超过20m时也最好采用就地补偿。

电动机就地补偿装置的接线有二种方式,一是并接在热元件的一次线后,热元件的整定电流应按补偿后的电机工作电流计,这种接线适合新安装的电机;另一种是装补偿电容器在接触器主接点之后,热元件一次线圈之前,热元件的整定电流就不计补偿的影响,这适合于进行改造的电机接线,这样做可使电容器与电动机一起投切。

处理好上述三部分,即减少自然无功、无功补偿及补偿装置的安装地点,就可以实现合理的选择无功补偿方式而达到节能的目的。

8.照明部分的节能

因为照明用量大而面广,因此,照明节能的潜力很大,应从下列几方面着手:

采用高效光源。白炽灯过去用得最广泛,因为它便宜,安装维护简单,它致命的弱点是发光率太低,因此目前常被各种发光率高,光色好,显色性能优异的新光源取代。低压钠灯和高压钠灯的发光率最高,但由于色温低,光色偏暖,显色指数在40~60之间,颜色失真度大,只能在路灯或广场照明用,其中显色指数在60的高显色性钠灯可与汞灯组成混合灯,用于工厂及体育馆照明,这也是量大面广的照明部分;发光率很高的金属卤化物灯,三基色荧光灯及稀土金属荧光灯,由于色温范围广,自3200K~4000K,光色选择性好,显色指数

中文资料

又高,可达80~95,颜色失真度小,尤其金属卤化物灯对人的皮肤显色性特别好,因此除用作商场、展厅的照明外,还广泛用在车站的候车室、码头的候船室、航空港的候机楼以及舞台的灯光照明等;一般荧光灯及稀土金属荧光灯可用在写字楼、住宅的照明;荧光高压汞灯、自整流高压汞灯、钠灯及三者组合的混合灯常用于生产厂房的照明。尽量不用或少用白炽灯,只有在局部艺术照明或防止高频光谱照射的古董字画照明中才使用,虽然它光色好,显色指数最高,但达不到节能的目的。

建筑物尽量利用自然采光,靠近室外部分的建筑面积,应将门窗开大,采用透光率较好的玻璃门窗,以达到充分利用自然光的目的。凡是可以利用自然光的这部分的照明,可采用按照度标准检测现场照度,进行灯光自动调节。

对气体放电灯,采用灯光无级自动调节,即调节灯丝从而达到调光的目的。但其代价太高,每套36W的灯管需要增加2000元~3000元的投资,而节省下来的电能,其电价是有限的,因为这仅在白天日照强时(一般在上午10时到下午3~4点钟 这段时间内)可减少一点人工照明,每支灯充其量节能25%,每天按12小时计,每年按365天计,则节省运行费用:M=36×0.25×12×365×0.78×10-3=30.7元 所以增加控制的投资需要2000~3000/30.7=65~97年才能回收,这是没有实用意义的。在工作照明中采用这种调光方案是不可取的。它只适宜用于特殊条件下,如气象台、导航站等小面积控制室,要求室内的照度与室外自然光自然协调的环境,才可采用这种调光设备。另外,这种调光设备用于稀土金属荧光灯,其频闪效应使人眼不易接受。对于可以充分利用自然光而且需要调光的场合,可采用分组分片自动开停的控制方案,虽然会有突变过程,但不会影响视力,也不会影响人的情绪,是可取的方式。

对长期需要开停,但又要按人流的多少自动调整照度的场合,在增加投资不多的情况下,对荧光灯可利用调压的方式,固定几级调节,如北京地铁采用澳大利亚的调光设备就是如此。

荧光灯彩用调电压调光,其节能效果并不显著。因为,气体放电灯的发光是靠离子在高电压下产生碰撞,达到一定能级而使荧光粉发光,因此光通量并

中文资料

不与电压成正比,电压下降10%,光通量差不多下降30%~40%,电压下降30%,灯会全熄。因此,气体放电灯采用调压方式调光,在实际工程中也很少采用。

照明节能中,除了满足照度、光色、显色指数外,应采用高效光源及高效灯具,对能利用自然光部分的灯具或可变照度的照明采用成组分片的自动控制开停方式,可达到照明节能的效果。

民用建筑的节能潜力很大,应在设计中精心考虑。但是在选用节能的新设备上,应具体了解其原理、性能、效果,从技术、经济上进行比较后,再选定节能设备,以达到真正节能的目的。

相关内容

热门阅读

最新更新

随机推荐