版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、DirectShow编程实现摄像头视频捕捉前言DirectShow是微软公司提供的一套在Windows平台上进行流媒体处理的开发包,与DirectX开发包一起发布。 DirectShow为多媒体流的捕捉和回放提供了强有力的支持。用DirectShow开发应用程序,我们可以很方便地从支持WDM驱动模型的采集卡上捕获数据,并且进行相应的后期处理乃至存储到文件中。DirectShow是基于COM的,为了编写DirectShow应用程序,需要了解COM客户程序编写的基础知识。Directshow提供了大量的接口,但在编程中发现还是不够方便,如果能构建一个视频捕捉类把常用的一些动作封装起来,那么就更方便
2、了。编程思路# W+ K9 7 M( u' z5 U2 P2 g为了更加容易建立视频捕捉应用程序,DirectShow提供了一个叫做Capture Graph Builder的对象,Capture Graph Builder提供IcaptureGraphBuilder2接口,该接口可以建立和控制Capture Graph。建立视频捕捉程序,必须首先获取并初始化IcaptureGraphBuilder2接口,然后选择一个适当的视频捕捉设备。选择好设备后,为该设备创建Capture filter,然后调用AddFilter把Capture filter添加到Filter Graph。如果仅
3、仅希望用摄像头来进行实时监控的话,只需要在上面的基础上调用ICaptureGraphBuilder2:RenderStream就可以了:ICaptureGraphBuilder2 *pBuild; / Capture Graph Builder$ N/ |3 v% Z- R. E# m/省略初始化部分代码IBaseFilter *pCap; / Video capture filter.: p# y! D s; # v+ Q/省略初始化和添加到Filter Graph部分代码pBuild->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDI
4、ATYPE_Video, pCap, NULL, NULL);DirectShow提供了一个捕捉静态图像的方法:使用Sample Grabber filter。依次按照以下三个步骤就可以了:: g; ?) m: X& : L# v第一步, 定义一个类实现Sample Grabber的回调接口IsampleGrabberCB:: V& ' u' w. G5 x n: Nclass CSampleGrabberCB : public ISampleGrabberCB k* a$ K2 s+ y" R5 c O1 /在后面提供的类中具体完成CSampleGr
5、abberCB mCB;第二步、调用RenderStream依次把Still pin、Sample Grabber和系统默认Renderer Filter连接起来。! N Q7 c/ O5 g/ ?, c" p第三步、配置Sample Grabber以捕获数据。0 U3 a3 L' H0 X视频捕捉类CCaptureVideo的具体实现/ CCaptureVideo视频捕捉类头文件+ 8 e2 - a) n3 a" r& Y# /#if!defined(AFX_CAPTUREVIDEO_H_F5345AA4_A39F_4B07_B843_3D87C4287A
6、A0_INCLUDED_)( 7 C! Y6 e# k$ H! l" o/ B#define AFX_CAPTUREVIDEO_H_F5345AA4_A39F_4B07_B843_3D87C4287AA0_INCLUDED_* q5 q1 K8 G: n/ CaptureVideo.h : header file/#if _MSC_VER > 1000#pragma once8 T5 E! a2 ' s: w' p#endif / _MSC_VER > 1000; P" f) U8 ) m& b% : #include <atlba
7、se.h>( R5 n1 ! A# p, g* j8 2 K/ K#include <windows.h>1 t* # u1 s: K7 E; L7 K! P#include <dshow.h>#ifndef SAFE_RELEASE#define SAFE_RELEASE( x ) & W! C9 K- L& Kif ( NULL != x ) + r4 n% s% Z- X; e" Q x->Release( ); x = NULL; ; Y# S/ u F6 # t( e2 W#endif& g& j$ Y $
8、 _2 w M2 T& kclass CSampleGrabberCB;class CCaptureVideo : public CWnd& d; d" E* d4 H" j0 Hfriend class CSampleGrabberCB;public:, C& * 2 H+ v4 # void GrabOneFrame(BOOL bGrab);HRESULT Init(int iDeviceID,HWND hWnd);* : Q% * & z7 rint EnumDevices(HWND hList);CCaptureVideo();vir
9、tual CCaptureVideo();private:5 d, n& g g) S a J9 M- V- HWND m_hWnd;, R! x( 1 h8 + |$ jIGraphBuilder *m_pGB;ICaptureGraphBuilder2* m_pCapture;1 p4 s, q0 2 S1 H) n% r7 q" PIBaseFilter* m_pBF;IMediaControl* m_pMC;IVideoWindow* m_pVW;CComPtr<ISampleGrabber> m_pGrabber;protected:void FreeM
10、ediaType(AM_MEDIA_TYPE& mt);+ k& H, y* W2 1 U: Xbool BindFilter(int deviceId, IBaseFilter *pFilter);void ResizeVideoWindow();3 ; v) ; _) C& G; - ) WHRESULT SetupVideoWindow();' S ; & X6 m. h# l% F5 KHRESULT InitCaptureGraphBuilder();& x+ L, r; J* M. o; F2 # a;#endif/!defined(
11、AFX_CAPTUREVIDEO_H_F5345AA4_A39F_4B07_B843_3D87C4287AA0_INCLUDED_)3 J7 S! A+ Y- Q' a1 E# N/-/ CCaptureVideo视频捕捉类实现文件CaptureVideo.cpp3 h) b7 q5 _1 j3 , v/ F; i7 /-/ CaptureVideo.cpp: implementation of the CCaptureVideo class.0 $ S% D, D e* u$ # . A3 T/" o( o7 S) S' M#include "stdafx
12、.h"' 2 P* _9 Q3 l! 6 X6 g3 #include "CaptureVideo.h" b! a, t: ) S) _#ifdef _DEBUG: |" r- 0 G$ b7 C#undef THIS_FILE2 7 N% p$ ! w- static char THIS_FILE=_FILE_;#define new DEBUG_NEW6 y3 s* o7 E: p) Z) P% l$ d* U( |' i#endif- K/ r7 l2 * |0 M2 T; NBOOL bOneShot=FALSE;/全局变量4 ,
13、 _1 5 s" z3 s- X7 uclass CSampleGrabberCB : public ISampleGrabberCB9 n" A7 Y- I4 P4 Q: X gpublic:long lWidth;long lHeight;$ r7 q+ i) P8 ? t4 e& fTCHAR m_szFileNameMAX_PATH;/ 位图文件名称CSampleGrabberCB( )* x4 N7 K- Y3 Z0 n6 ustrcpy(m_szFileName, "c:donaldo.bmp");STDMETHODIMP_(ULON
14、G) AddRef() return 2; STDMETHODIMP_(ULONG) Release() return 1; STDMETHODIMP QueryInterface(REFIID riid, void * ppv)if( riid = IID_ISampleGrabberCB | riid = IID_IUnknown )1 : V' C8 F2 u9 f% d5 |& N/ E*ppv = (void *) static_cast<ISampleGrabberCB*> ( this );" h4 E1 C7 i. V; U0 C9 are
15、turn NOERROR;& ( j0 c" L0 x+ P" J! s+ o1 w# return E_NOINTERFACE;' N1 t- F8 W! r* l2 p2 7 b' 7 _5 o" R/ a! u8 P% v# nSTDMETHODIMP SampleCB( double SampleTime, IMediaSample * pSample )" e, U" Z2 d _+ e) l, ereturn 0; w* z) ! Y- J2 M0 b. a; o! c5 P9 # c0 LSTDMETHOD
16、IMP BufferCB( double dblSampleTime, BYTE * pBuffer, long lBufferSize ). C1 P/ , 4 w. q7 A' 7 p5 dif( !bOneShot )return 0;if (!pBuffer)return E_POINTER;SaveBitmap(pBuffer, lBufferSize);& g8 e; 4 q7 O4 i2 wbOneShot = FALSE;2 i$ , S! B6 G: B4 _! J! greturn 0;$ j7 Q. f% & a5 w4 u( m* V4 /创建位
17、图文件BOOL SaveBitmap(BYTE * pBuffer, long lBufferSize )HANDLE hf = CreateFile( U& L4 6 U: U# X. V5 wm_szFileName, GENERIC_WRITE, FILE_SHARE_READ, NULL,: e1 B- I# E/ ?5 oCREATE_ALWAYS, NULL, NULL );0 ' I0 l0 C8 I" Bif( hf = INVALID_HANDLE_VALUE )return 0;. j) X6 Y' J! T9 c/ L( H/ 写文件头,
18、 h# h# S% W( r" gBITMAPFILEHEADER bfh;memset( &bfh, 0, sizeof( bfh ) );- A8 Y4 i6 E0 L' 4 y4 _/ _3 obfh.bfType = MB;! V' N6 T2 # Abfh.bfSize = sizeof( bfh ) + lBufferSize + sizeof( BITMAPINFOHEADER );& R2 V2 R' 6 Q' x J4 ; Fbfh.bfOffBits = sizeof( BITMAPINFOHEADER ) + si
19、zeof( BITMAPFILEHEADER );DWORD dwWritten = 0; U+ k0 A7 ( K9 aWriteFile( hf, &bfh, sizeof( bfh ), &dwWritten, NULL );/ 写位图格式BITMAPINFOHEADER bih;memset( &bih, 0, sizeof( bih ) );( P& Z! B% D3 v6 s5 1 I7 ?2 hbih.biSize = sizeof( bih );bih.biWidth = lWidth;8 E$ W6 x- O) r( + $ 4 Wbih.bi
20、Height = lHeight;* & F& O) F# c% l7 ebih.biPlanes = 1;bih.biBitCount = 24;WriteFile( hf, &bih, sizeof( bih ), &dwWritten, NULL );/ 写位图数据$ _ L7 V$ j, |9 xWriteFile( hf, pBuffer, lBufferSize, &dwWritten, NULL );/ ( R2 D' T, I W* s; ZCloseHandle( hf );return 0;' M( F9 e"
21、; 2 d2 ?, x. r3 R! q( 2 L;+ c( D; d2 x5 h6 v; F8 ICSampleGrabberCB mCB;/ q# K( i4 U4 l/ ) ?/ Construction/Destruction/* S/ X g7 K6 R0 q; CCaptureVideo:CCaptureVideo()1 ( i3 D. k7 P' n9 a/COM Library Intializationif(FAILED(CoInitialize(NULL) /*, COINIT_APARTMENTTHREADED)*/ * R- g& r0 ?4 t( Af
22、xMessageBox("CoInitialize Failed!rn");* z- g7 8 O+ A* T8 A, U! j. : w: w$ p3 return;* ?" P4 L, p5 u1 K! b$ Y G* n5 t! 0 Bm_hWnd = NULL;/ q/ O# n$ k+ t0 Nm_pVW = NULL;* k, ?3 X+ c7 b$ S9 f8 2 v& y5 o$ m_pMC = NULL;1 0 / j$ w3 R7 Zm_pGB = NULL;m_pCapture = NULL;2 / i8 h a6 s. k( t5
23、p6 K& O$ x, i% b% rCCaptureVideo:CCaptureVideo()8 h+ D) K) u. S' z6 W/ Stop media playbackif(m_pMC)m_pMC->Stop();8 F/ k6 S5 j6 c# 8 hif(m_pVW)m_pVW->put_Visible(OAFALSE);m_pVW->put_Owner(NULL);: " r! p$ n* SAFE_RELEASE(m_pCapture);/ U; V1 m. D* C$ ) B. B% z* K+ wSAFE_RELEASE(m_
24、pMC);, b0 T; ; Z" S$ O# ) FSAFE_RELEASE(m_pGB);SAFE_RELEASE(m_pBF);( 4 G2 e- A5 s9 a( B8 L1 sCoUninitialize( );int CCaptureVideo:EnumDevices(HWND hList) N' * W$ ?) * i, M6 # J* s0 & if (!hList)2 7 t' U: a9 C) V6 n+ n! Greturn -1; ?6 X' f3 V1 O1 Y9 g$ 1 Q dint id = 0;' B# G:
25、p. V, # x: . H6 q* A ' s7 2 % F* 7 R- U/枚举视频扑捉设备ICreateDevEnum *pCreateDevEnum;HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER,IID_ICreateDevEnum, (void*)&pCreateDevEnum);- n7 m; _$ s8 D0 p" Gif (hr != NOERROR)return -1;CComPtr<IEnumMoniker> pEm;hr
26、 = pCreateDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory,&pEm, 0);if (hr != NOERROR)return -1;pEm->Reset();ULONG cFetched;' J% # 4 Q$ o1 d# ?IMoniker *pM;! o2 % a0 a3 e9 Cwhile(hr = pEm->Next(1, &pM, &cFetched), hr=S_OK), z5 |; 4 j, U0 fIPropertyBag *pBag;$ 5
27、S: q: d, O% Phr = pM->BindToStorage(0, 0, IID_IPropertyBag, (void *)&pBag);if(SUCCEEDED(hr). w% ?) Q7 f/ c* LVARIANT var;+ d: W# y4 B1 E1 r$ m, S, q% O, cvar.vt = VT_BSTR;hr = pBag->Read(L"FriendlyName", &var, NULL);if (hr = NOERROR) b7 & r& U: 9 u# g2 QTCHAR str2048;
28、! b7 T0 z& J$ M* C& K- t3 Eid+;WideCharToMultiByte(CP_ACP,0,var.bstrVal, -1, str, 2048, NULL, NULL);:SendMessage(hList, CB_ADDSTRING, 0,(LPARAM)str);SysFreeString(var.bstrVal);0 |& q2 |/ k0 % Y( k+ ' W! r% 0 Y1 pBag->Release();% C6 N# z; e5 N+ . q$ H+ ypM->Release();) / o$ T% M
29、. f4 * h- u% 1 e+ F2 O7 h2 g- I' H) |return id;3 d, ) ?. z: c z, X2 D- l* c. iHRESULT CCaptureVideo:Init(int iDeviceID, HWND hWnd) R3 V* : M Y& _! V: H9 _HRESULT hr;hr = InitCaptureGraphBuilder();if (FAILED(hr)" $ J: | b; gAfxMessageBox("Failed to get video interfaces!");+ P;
30、x! + g6 j, Z9 return hr;, P4 Y: ?0 O" B' / Bind Device Filter. We know the device because the id was passed inif(!BindFilter(iDeviceID, &m_pBF)return S_FALSE;) v5 M/ % p, 0 rhr = m_pGB->AddFilter(m_pBF, L"Capture Filter");/ hr = m_pCapture->RenderStream(&PIN_CATEGORY
31、_PREVIEW, &MEDIATYPE_Video,9 : u1 |- P* 4 C' L0 / m_pBF, NULL, NULL);2 h3 N2 H* B- o% P( v( T/ create a sample grabberhr = m_pGrabber.CoCreateInstance( CLSID_SampleGrabber );+ v$ r8 p2 D! + V, V2 y' Qif( !m_pGrabber )% |) L" N$ J* rAfxMessageBox("Fail to create SampleGrabber, m
32、aybe qedit.dll is not registered?");return hr;3 e4 T. l4 t. B7 ( ?" oCComQIPtr< IBaseFilter, &IID_IBaseFilter > pGrabBase( m_pGrabber );: K$ p2 m* K9 D! $ E) M/设置视频格式: d3 N. H h5 E6 d3 R* U2 aAM_MEDIA_TYPE mt;8 l7 _0 y* P& m$ TZeroMemory(&mt, sizeof(AM_MEDIA_TYPE);+ '
33、 q( s! M& o: f% N% M8 w3 Ymt.majortype = MEDIATYPE_Video;mt.subtype = MEDIASUBTYPE_RGB24; y1 G q3 7 p9 s4 d' E- qhr = m_pGrabber->SetMediaType(&mt);/ v8 H5 ( Z! C# w! kif( FAILED( hr ) )# i- t8 G1 t# j- s3 l* ZAfxMessageBox("Fail to set media type!");return hr; m7 C+ q( ; g;
34、 b6 Rhr = m_pGB->AddFilter( pGrabBase, L"Grabber" );" # & p1 A6 f: O! v; if( FAILED( hr ) )AfxMessageBox("Fail to put sample grabber in graph");4 v* 9 Q7 z" % 9 Ireturn hr;% _: v. s2 F# T, u% / try to render preview/capture pin 0 x O6 d6 Y) Z4 U* W$ b c; Chr = m_
35、pCapture->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video,m_pBF,pGrabBase,NULL);+ 9 : u" Z7 q8 p0 Fif( FAILED( hr ) )hr = m_pCapture->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video,m_pBF,pGrabBase,NULL);. d1 ? x: k4 l2 x; mif( FAILED( hr ) )AfxMessageBox("C
36、ant build the graph");* 5 w) L) E; g4 ! nreturn hr;7 Q' J. a8 h" * yhr = m_pGrabber->GetConnectedMediaType( &mt );8 d t: i; K" d. E- H# | Bif ( FAILED( hr) )AfxMessageBox("Failt to read the connected media type");return hr;7 A$ P+ z8 e: ?% & lVIDEOINFOHEADER *
37、 vih = (VIDEOINFOHEADER*) mt.pbFormat;mCB.lWidth = vih->bmiHeader.biWidth;1 |- D. S/ ) q; n) j" n" G9 p8 mCB.lHeight = vih->bmiHeader.biHeight;FreeMediaType(mt);9 u0 V( r; " O$ C) P# Phr = m_pGrabber->SetBufferSamples( FALSE );hr = m_pGrabber->SetOneShot( FALSE );- s! N6 L
38、& z! z+ p! Vhr = m_pGrabber->SetCallback( &mCB, 1 );1 X( G( G8 ?. L/设置视频捕捉窗口+ Z3 ) U: U! D& v9 Gm_hWnd = hWnd ;SetupVideoWindow();hr = m_pMC->Run();/开始视频捕捉if(FAILED(hr)AfxMessageBox("Couldnt run the graph!");return hr;7 + R6 Z0 S3 D6 z8 C* l% x4 O7 Wreturn S_OK;* d' B
39、) Q' r: r Ebool CCaptureVideo:BindFilter(int deviceId, IBaseFilter *pFilter): D. w( Q& . if (deviceId < 0)! W" |, G' g$ O5 N1 J, % return false;4 * $ e* k5 J) u' T# j! n8 k) V( _ P3 f/ J& I/ enumerate all video capture devicesCComPtr<ICreateDevEnum> pCreateDevEnum;H
40、RESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER,IID_ICreateDevEnum, (void*)&pCreateDevEnum);if (hr != NOERROR)return false;1 Y, Z) p; ) m ?CComPtr<IEnumMoniker> pEm;hr = pCreateDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory,&pEm, 0);if
41、(hr != NOERROR)/ m5 v8 b! l5 G0 N- J" Z1 p w% v greturn false;. W& e2 n, f5 Z7 : H1 MpEm->Reset();4 X- G, l* W- n4 I W+ B/ l; f2 c0 IULONG cFetched;% / W& s7 W( C9 C0 W4 h: ! B* AIMoniker *pM;. C2 k+ ?! j- d7 H- j) E2 % P/ sint index = 0;while(hr = pEm->Next(1, &pM, &cFetc
42、hed), hr=S_OK, index <= deviceId)1 w$ Y. G' _( d6 _. ; GIPropertyBag *pBag;! 8 W6 E6 o4 x6 a2 i- Lhr = pM->BindToStorage(0, 0, IID_IPropertyBag, (void *)&pBag);/ d. N- v1 t9 y, if(SUCCEEDED(hr)# x2 l( C: T1 s7 i0 % ; e$ G- C: dVARIANT var;var.vt = VT_BSTR;hr = pBag->Read(L"Frie
43、ndlyName", &var, NULL);if (hr = NOERROR)5 S5 : A8 & e6 Q$ r0 7 |9 if (index = deviceId)! t5 p8 _. k3 G4 q8 T0 d! v( m! s) y! opM->BindToObject(0, 0, IID_IBaseFilter, (void*)pFilter);SysFreeString(var.bstrVal);* i, Z& l( D U$ y" F" pBag->Release();pM->Release();- q
44、# a# n3 t+ j& M5 Cindex+;- p) j7 q+ 3 Z5 m' M. S! W3 f8 I$ y: L2 Z6 C0 freturn true;) e1 |2 . L" c8 i6 8 H$ QHRESULT CCaptureVideo:InitCaptureGraphBuilder()6 P! . e5 C; F; F' M$ R8 / X$ ( D* r8 p8 f* jHRESULT hr; p/ u7 o4 , i! U) P& + h' f" u" y/ 创建IGraphBuilder接口$
45、 z; R; a5 K$ q; T( x hr=CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void *)&m_pGB);/ 创建ICaptureGraphBuilder2接口- 5 v$ Y' M2 # ehr = CoCreateInstance (CLSID_CaptureGraphBuilder2 , NULL, CLSCTX_INPROC,: ; 6 j: H* l) v. n7 X; 6 g0 jIID_ICaptureGraphBuilder
46、2, (void *) &m_pCapture);if (FAILED(hr)return hr;+ u6 m* O+ fm_pCapture->SetFiltergraph(m_pGB);3 B1 # o c4 U* m! E; Rhr = m_pGB->QueryInterface(IID_IMediaControl, (void *)&m_pMC);if (FAILED(hr)return hr;/ G# 9 g8 h5 B0 t1 H7 h+ Ohr = m_pGB->QueryInterface(IID_IVideoWindow, (LPVOID *
47、) &m_pVW);$ I1 H, j" a- C8 g5 |if (FAILED(hr)return hr; c1 S: S! W3 8 O, lreturn hr;HRESULT CCaptureVideo:SetupVideoWindow()HRESULT hr;hr = m_pVW->put_Owner(OAHWND)m_hWnd);if (FAILED(hr)return hr;& a 3 W, g* - f0 Ihr = m_pVW->put_WindowStyle(WS_CHILD | WS_CLIPCHILDREN);if (FAILED(
48、hr)return hr;0 S- , ?; H. Y/ p% O) JResizeVideoWindow();, e8 f: $ : v, t* J5 p A8 hr = m_pVW->put_Visible(OATRUE);# c: a+ 3 I4 H; G5 areturn hr;: a G, b2 J4 T: J4 D0 j; c1 q; xvoid CCaptureVideo:ResizeVideoWindow()$ P7 g9 s# v/ q! w) M$ bif (m_pVW). B; ; & g: e# h3 E3 G9 L% o/让图像充满整个窗口CRect r
49、c;4 O7 o7 g- A% E! Q. b:GetClientRect(m_hWnd,&rc);$ a, ?6 ?5 k; # Y% Z& Q0 K/ nm_pVW->SetWindowPosition(0, 0, rc.right, rc.bottom);" r6 K6 x1 q- E5 V) jvoid CCaptureVideo:GrabOneFrame(BOOL bGrab)2 1 x8 v. R, W$ |+ d0 U5 i0 nbOneShot = bGrab;void CCaptureVideo:FreeMediaType(AM_MEDIA_TYPE& mt), ( A8 l5 a0 H5 b$ S2 s& h9 wif (mt.cbFormat != 0) " A: k! T h0 C) RCoTaskMemFree(PVOID)mt.pbFormat);+ B& E( W7 9 |4 C4 s/ Strictly unnecessary but tidiermt.cbFormat = 0;mt.pbFormat = NULL;)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年贵州省兴义市政府采购评审专家测试题库及参考答案
- 2025年贵州省都匀市政府采购评审专家测试题库及参考答案
- 2025年梦幻神秘小屋答题题库及答案
- 2026年陕西省选调生招录(面向复旦大学)考试参考题库带答案解析
- 2025年10月自考00319行政组织理论试题及答案含评分参考
- 小学语文现代诗歌教学的创新实践策略
- 2025年10月自考00143经济思想史.试题及答案
- 2025贵州黔西南州黎峨中学秋季赴省内外高校引进高层次人才和急需紧缺人才5人笔试备考题库带答案解析
- 2025年榆林神木市文化产业投资集团有限公司招聘(25人)备考题库附答案解析
- 科创人才培养中的化学实验教学实践与创新
- 05.辩论的基础知识
- SMC与不锈钢等材料优缺点分析
- 西湖风景区规划课件
- 初二数学上册知识点的测试题汇总
- 《细胞工程学》考试复习题库(带答案)
- 针灸治疗急症精选课件
- 师说一等奖优秀课件师说优质课一等奖
- 《格林童话》名著导读读书分享PPT
- 工业互联网行业分析研究报告
- 中频炉停水、漏炉演练方案
- T-CAMET 04017.5-2019 城市轨道交通 全自动运行系统规范 第5部分:工程安全评估
评论
0/150
提交评论