软件课程设计基于DirectShow的P2P网络视频采集传输与播放系统

上传人:仙*** 文档编号:34002966 上传时间:2021-10-20 格式:DOC 页数:18 大小:542.02KB
收藏 版权申诉 举报 下载
软件课程设计基于DirectShow的P2P网络视频采集传输与播放系统_第1页
第1页 / 共18页
软件课程设计基于DirectShow的P2P网络视频采集传输与播放系统_第2页
第2页 / 共18页
软件课程设计基于DirectShow的P2P网络视频采集传输与播放系统_第3页
第3页 / 共18页
资源描述:

《软件课程设计基于DirectShow的P2P网络视频采集传输与播放系统》由会员分享,可在线阅读,更多相关《软件课程设计基于DirectShow的P2P网络视频采集传输与播放系统(18页珍藏版)》请在装配图网上搜索。

1、基于DirectShow的P2P网络视频采集传输与播放系统软件课程设计目 录1.概述32.需求分析32.1 开发要求32.2具体要求32.3开发平台33.实验原理43.1DirectShow系统43.2 Filter43.3数字视频编码标准53.4 socket网络64.软件设计及思路64.1 开发环境的配置64.2详细设计74.2.1概要设计74.2.2所需模块74.2.3 Filter 构建74.2.4子模块功能描述84.2.5程序运行结果145.设计问题及解决:165.1 Graph Edit165.2 配置平台165.3 filter依赖于dll的问题165.4抓图错误问题165.5

2、初始化设备问题175.6总体认知18参考文献:181.概述DirectShow是一个windows平台上的流媒体框架,提供了高质量的多媒体流采集和回放功能。它支持多种多样的媒体文件格式,包括ASF、MPEG、AVI、MP3和WAV文件。同时DirectShow支持使用WDM驱动或早期的VFW驱动来进行多媒体流的采集。DirectShow整合了其它的DirectX技术,能自动地侦测并使用可利用的音视频硬件加速,也能支持没有硬件加速的系统。DirectShow大大简化了媒体回放、格式转换和采集工作。但与此同时,它也为用户自定义的解决方案提供了底层流控制框架,从而使用户可以自行创建支持新的文件格式或

3、其它用途的DirectShow组件。DirectShow的主要功能是提供对多媒体流的捉捕与回放。这种多媒体流既可以来自本地磁盘文件,也可以来自网络上的远程服务器。也就是说,它提供了一种“在线播放”的功能,在远程数据尚未完全传输到本地机器上的同时,本地应用程序可不必等待数据完全传输完毕再进行播放,可以一边传输,一边播放。这就为网络化的视频采集数据的实时解码显示提供一个方便的开发平台。点对点技术(peer-to-peer, 简称P2P)又称对等互联网络技术,是一种网络新技术,依赖网络中参与者的计算能力和带宽,而不是把依赖都聚集在较少的几台服务器上。P2P网络通常用于通过连接来连接节点。这类网络可以

4、用于多种用途,各种文件共享软件已经得到了广泛的使用。P2P技术也被使用在类似VoIP等实时媒体业务的数据通信中。2.需求分析2.1 开发要求1. 熟悉、掌握VC+开发工具,以及DirectShow SDK9.0软件开发包。2. 熟悉了解Socket网络编程;3. 开发基于DirectShow的应用软件,要求能够完成P2P的网络视频采集、视频传输、视频播放的功能。2.2具体要求 基本功能:实现采集视频、传输视频、实现异地播放采集视频; 扩展功能:支持多种格式的视频格式(如MPEG4,MPEG2,MPEG1,H.261,H.263.H.264,AVI,rm等),回放,摘拍。2.3开发平台1 硬件:

5、视频摄像头一个;PC机两台,局域网。2 软件 :操作系统 Windows98/XP/NT/2003,安装TCP/IP协议。视频摄像头驱动程序。开发平台Visual C+6.0 。软件开发包 DirectShow SDK9.0。3.实验原理3.1DirectShow系统如图所示,DirectShow系统位于Ring3应用层中,Ring0为硬件设备。DirectShow使用Filter Graph 的模型来管理整个数据流的处理过程。参与数据处理的各个功能模块叫做Filter。各个Filter按照一定的顺序连接成一条流水线协同工作。3.2FilterFilter是一个执行特定任务的COM对象。Fil

6、ter分为3类,Source Filters, Transform Filters, 和Rendering Filters。Source Filters主要用于获取数据,数据源可以是文件,因特网计算机里的采集卡。然后将数据往下传输;Transform Filters主要负责数据的格式转换,如数据流分离,解码及编码等。然后继续传输数据。Rendering Filters主要负责数据的最终去向。将数据送给显卡,声卡进行多媒体演示或者输出到文件进行存储。Pin是Filter之间单方向数据流的连接点。Filter一般由一个或多个Pin组成。Filter之间通过Pin连接,构成顺序通路。其中,Sourc

7、e Filters仅含有输出Pin不含有输入Pin;Transform Filters既含有输出Pin也含有输入Pin;Rendering Filters仅含有输入Pin不含有输出Pin。Filter可能处于有三种不同的状态:运行、停止和暂停状态。filter在运行状态时处理数据,停止状态时停止处理数据,暂停状态则是表示就绪,可以开始进入运行状态。除了极个别的情况,一个filter Graph中的所有filter通常都处理同一个状态下。所谓的Filter Pin之间的连接,实际上是Pin之间Media Type(媒体类型)的一个协商过程。连接总是从输出Pin指向输入Pin的。连接的大致过程为,

8、枚举欲连接的输入Pin上所有的媒体类型,逐一用这些媒体类型与输出Pin进行连接,如果输出Pin也接受这种媒体类型,则Pin之间的连接宣告成功;如果所有输入Pin上枚举的媒体类型输出Pin都不支持,则枚举输出Pin上的所有媒体类型,并逐一用这些媒体类型与输入Pin进行连接。如果输入Pin接受其中的一种媒体类型,则Pin之间的连接到此也宣告成功;如果输出Pin上的所有媒体类型,输入Pin都不支持,则这两个Pin之间的连接过程宣告失败。当Filter的Pin之间连接完成,也就是说,连接双方通过协商取得了一种大家都支持的媒体类型之后,即开始为数据传输做准备。这些准备工作中,最重要的是Pin上的内存分配

9、器的协商,一般也是由输出Pin发起。在DirectShow Filter之间,数据是通过一个一个数据包传送的,这个数据包叫做Sample。Sample本身是一个COM对象,拥有一段内存用以装载数据,Sample就由内存分配器(Allocator)来统一管理。已成功连接的一对输出、输入Pin使用同一个内存分配器,所以数据从输出Pin传送到输入Pin上是无需内存拷贝的。而典型的数据拷贝,一般发生在Filter内部,从Filter的输入Pin上读取数据后,进行一定意图的处理,然后在Filter的输出Pin上填充数据,然后继续往下传输。基于 Filter有两种主要的数据传输模式:推模式(Push Mo

10、del)和拉模式(Pull Model)。参考图如下:所谓推模式,即源Filter(Source Filter)自己能够产生数据,并且一般在它的输出Pin上有独立的子线程负责将数据发送出去,而所谓拉模式,即源Filter不具有把自己的数据送出去的能力,这种情况下,一般源Filter后紧跟着接一个Parser Filter或Splitter Filter,这种Filter一般在输入Pin上有个独立的子线程,负责不断地从源Filter索取数据,然后经过处理后将数据传送下去推模式下,源Filter是主动的;拉模式下,源Filter是被动的。3.3数字视频编码标准H.261是第一个实用的数字视频编码标

11、准。H.263是由ITU-T制定的视频会议用的低码率视频编码标准,属于视频编解码器。H.263最初设计为基于H.324的系统进行传输。H.264是ITU-T的VCEG(视频编码专家组)和ISO/IEC的MPEG(活动图像编码专家组)的联合视频组(JVT:joint video team)开发的一个新的数字视频编码标准,它既是ITU-T的H.264,又是ISO/IEC的MPEG-4的第10 部分。AVI英文全称为Audio Video Interleaved,即音频视频交错格式。是将语音和影像同步组合在一起的文件格式。它对视频文件采用了一种有损压缩方式,但压缩比较高,画面质量不是太好。3.4 s

12、ocket网络SOCKET用于在两个基于TCP/IP协议的应用程序之间相互通信。在WINDOWS系统中,SOCKET称为WINSOCK。:客户方和服务方。当两个应用之间需要采用SOCKET通信时,首先需要在两个应用之间(可能位于同一台机器,也可能位于不同的机器)建立SOCKET连接,发起呼叫连接请求的一方为客户方,接受呼叫连接请求的一方成为服务方。客户方和服务方是相对的,同一个应用可以是客户方,也可以是服务方。在客户方呼叫连接请求之前,它必须知道服务方在哪里。所以需要知道服务方所在机器的IP地址或机器名称,如果客户方和服务方事前有一个约定就好了,这个约定就是PORT(端口号)。也就是说,客户方

13、可以通过服务方所在机器的IP地址或机器名称和端口号唯一的确定方式来呼叫服务方。在客户方呼叫之前,服务方必须处于侦听状态,侦听是否有客户要求建立连接。一旦接到连接请求,服务方可以根据情况建立或拒绝连接。连接方式有两种,同步方式(Blocking)和(noBlocking).客户方发送的消息可以是文本,也可以是二进制信息流。当客户方的消息到达服务方端口时,会自动触发一个事件(event),服务方只要接管该事件,就可以接受来自客户方的消息了。由于实验要求在局域网中实现实时通信,本实验采取RTP网络协议进行传输。4.软件设计及思路4.1 开发环境的配置编译baseclasses,目录为D:DX90SD

14、KSamplesC+DirectShow,生成静态库,生成Strmbasd.lib;其中build的时候应该选择DEBUG和RELEASE编译,不能用DEBUG_UNICODE。在Tools-Options-Projects and solutions-vc+ directories-show directories for里选择include files,然后增加D:DX90SDKIncludeD:DX90SDKSamplesC+DirectShowBaseClassesD:DX90SDKSamplesC+Common在Tools-Options-Projects and solutions

15、-vc+ directories-show directories for里选择Library files,然后增加D:DX90SDKLibD:DX90SDKSamplesC+DirectShowBaseClassesDEBUGD:DX90SDKSamplesC+DirectShowBaseClassesRELEASE配置DirectShow应用程序开发项目需要连接的库文件,执行VC的菜单命令Project|Settings,在随后的对话框中单击Link标签,在Object/library modules文本框中,Debug版输入strmbasd.lib Winmm.lib, Release版

16、输入strmbasd.lib Winmm.lib。在调用任何COM库函数前,务必调用CoInitialize或CoInitializeEx进行COM库的初始化;在结束所有COM操作后,调用CoInitialize进行反初始化。当程序中多个线程需要COM库函数调用时,每个线程都要进行初始化和反初始化,总之要保证调用的一一配对。4.2详细设计4.2.1概要设计采用VC编写的视频通信程序,主要采用了DirectShow技术和TCP,Socket等实现代码。在完成实时视频传输过程中,采用实时传送协议(Real-time Transport Protocol或简写RTP)完成。实时传输协议(RTP)为数

17、据提供了具有实时特征的端对端传送服务。应用程序通常在 UDP 上运行 RTP 以便使用其多路结点和校验服务。RTP 可以与其它适合的底层网络或传输协议一起使用。如果底层网络提供组播方式,那么 RTP 可以使用该组播表传输数据到多个目的地。对于视音频数据的传输,只简单地使用数据报套接字传输音视频数据是不可行的,还必须在UDP层上采用RTP来改善服务质量。实时传输协议提供具有实时特征的、端到端的数据传输服务。Directshow对于音视频的采集提供了很好的接口,利用ICaptureGraphBuilder2接口可以很轻松的建 立起视频捕捉的graph图,通过枚举音频设备Filter,也可以很轻松的

18、实现音频的捕捉。同时,我们可以自己封装RTP的协议,来自己实现一个filter,用来发送和接收音视频数据。在视频采集和播放的过程中,采用基于DirectShow的功能的视频采集的source filter以及audio&video transform filters和audio&video rendering filters。在audio&video transform filters和audio&video rendering filters间通过基于RTP的网络协议进行传输。使用AMCAP进行视频保存在本地文件夹对于保存好的文件进行回放及截屏时,采用simplayer进行操作。具体实现将在

19、下面具体介绍中举例。4.2.2所需模块4.2.3 Filter 构建定义的Filter包括 RTP Source Filter ,RTP Render Filter,RTP Demux Filter,RTP Receive Playload Handler (RPH) filter,RTP Send Payload (SPH) filter。RTP Source filter被用来从一个单独的RTP会话中接收RTP和RTCP包。这个filter提供一个指定发送给其它主机RTCP接收器报告和指定网络地址和端口接口来接收RTP会话的接口。RTP Rend filter是用来将数据发到网络上的一个f

20、ilter,这个filter也提供了和RTP source Filter 类似的接口。RTP Demux filter用来多路分离来自 RTP Source filter的RTP 包,这个filter有一个或者多个输出的pin。这个Filter提供了如何控制多路分离和如何分配到特定输出pin的接口。RTP RPH Filter 是用来网络过来的RTP包还原成原来的数据格式,主要支持H.261,H.263和常见的多种视频负载类型。4.2.4子模块功能描述初始化视频通话模块BOOL CAVDConfDlg:OnInitDialog()CDialog:OnInitDialog();SetIcon(m

21、_hIcon, TRUE);SetIcon(m_hIcon, FALSE);/初始化客户端if (InitRTCClient() != S_OK)MessageBox ( Initialization Error );m_cMakeCall.EnableWindow ( FALSE );m_cAppCall.EnableWindow ( FALSE );m_cMessaging.EnableWindow ( FALSE );m_cTuning.EnableWindow ( FALSE );m_cWhiteboard.EnableWindow ( FALSE );/如果初始化失败使所有按钮无用r

22、eturn TRUE; 网络传输接受模块void CAVDConfDlg:OnMakecall() MakeCallDlg cDlg; /展示SIP对话框if (cDlg.DoModal() = IDOK)MakeCall (RTCST_PC_TO_PC, g_bstrAddr); /进行视频传输HRESULT CAVDConfDlg:MakeCall(RTC_SESSION_TYPE enType, BSTR bstrURI)/启动视频传输并 返回S_OK是否成功 HRESULT hr;if (enType != RTCST_IM) /一次只允许一个视频传输 if (m_AVDlg) & (

23、m_AVDlg.GetState () != RTCSS_IDLE) MessageBoxW (m_hWnd, LAn audio/video call is in progress!, NULL, MB_OK ); return S_FALSE; IRTCSession * pSession = NULL; /创建一个客户端 hr = m_pClient-CreateSession(enType, NULL, NULL, 0, &pSession); if (FAILED(hr) return hr; /创建客户端失败 hr = pSession-AddParticipant(bstrURI

24、, NULL, &m_Participant);增加用户,初始化RTCif (FAILED(hr) /增加用户失败 SAFE_RELEASE(pSession); return hr; hr = AddSession(pSession, enType); if (FAILED(hr) return hr; return S_OK;启动RTP层模块HRESULT CAVDConfDlg:InitRTCClient()HRESULT hr; /创建RTP用户m_pClient = NULL;m_pEvents = NULL;hr = CoInitialize(NULL); /初始化COM库if (

25、FAILED(hr)return hr;hr = CoCreateInstance (CLSID_RTCClient, NULL,/初始化RTC COM objectCLSCTX_INPROC_SERVER, IID_IRTCClient,(LPVOID *)&m_pClient);if (FAILED(hr)return hr; /不能上传RTC用户交互hr = m_pClient-Initialize(); /初始化用户交互if (FAILED(hr) /不能初始化用户交互SAFE_RELEASE(m_pClient);return hr;m_pClient-SetPreferredMed

26、iaTypes ( RTCMT_ALL, VARIANT_TRUE );/选择特定媒体类型,启动Audiolong lEventMask = RTCEF_SESSION_STATE_CHANGE | Video,T.120层 RTCEF_MESSAGING | RTCEF_MEDIA | RTCEF_INTENSITY | RTCEF_CLIENT;hr = m_pClient-put_EventFilter( lEventMask );/启动event filter if ( FAILED(hr) ) SAFE_RELEASE(m_pClient); return hr; m_pEvents

27、 = new CRTCEvents; /创建event sink object if (!m_pEvents) SAFE_RELEASE(m_pClient); return hr; hr = m_pEvents-Advise( m_pClient, m_hWnd );/启动 event handler if ( FAILED(hr) ) SAFE_RELEASE(m_pClient); return hr; hr = m_pClient-put_ListenForIncomingSessions(RTCLM_BOTH);/为RTP用户设置监听模式 if ( FAILED(hr) ) SAFE

28、_RELEASE(m_pClient);/使监听模式失效 return hr; if (m_AVDlg)m_AVDlg.SetState (RTCSS_IDLE);return S_OK;在RTP层处理RTP事件模块HRESULT CAVDConfDlg:OnRTCEvent(UINT message, WPARAM wParam, LPARAM lParam) IDispatch * pDisp = (IDispatch *)lParam; RTC_EVENT enEvent = (RTC_EVENT)wParam; HRESULT hr; switch ( wParam ) case RT

29、CE_SESSION_STATE_CHANGE: IRTCSessionStateChangeEvent * pEvent = NULL; / Get the event handle associated with the current sessionhr = pDisp-QueryInterface( IID_IRTCSessionStateChangeEvent, (void *)&pEvent ); if (SUCCEEDED(hr) OnRTCSessionStateChangeEvent(pEvent); SAFE_RELEASE(pEvent); break; case RTC

30、E_MESSAGING: IRTCMessagingEvent * pEvent = NULL; hr = pDisp-QueryInterface( IID_IRTCMessagingEvent, (void *)&pEvent ); if (SUCCEEDED(hr) OnRTCMessagingEvent(pEvent); SAFE_RELEASE(pEvent); break; case RTCE_MEDIA: IRTCMediaEvent * pEvent = NULL; hr = pDisp-QueryInterface( IID_IRTCMediaEvent, (void *)&

31、pEvent ); if (SUCCEEDED(hr) OnRTCMediaEvent(pEvent); SAFE_RELEASE(pEvent); break; case RTCE_INTENSITY: IRTCIntensityEvent * pEvent = NULL; hr = pDisp-QueryInterface( IID_IRTCIntensityEvent, (void *)&pEvent ); if (SUCCEEDED(hr) OnRTCIntensityEvent(pEvent); SAFE_RELEASE(pEvent); break; case RTCE_CLIEN

32、T: IRTCClientEvent * pEvent = NULL; hr = pDisp-QueryInterface( IID_IRTCClientEvent, (void *)&pEvent ); if (SUCCEEDED(hr) OnRTCClientEvent(pEvent); SAFE_RELEASE(pEvent); break; SAFE_RELEASE(pDisp); return S_OK;扩展功能:simple player使用VC项目向导生成一个基于对话框的MFC应用程序,项目名为simpleplayer配置VC连接库,并添加COM库的初始化以及反初始化代码:在资源

33、编辑器中编辑主对话框界面。定义一个视频窗口的控制对象把FilterGraph的各种相关操作封装成一个类CDXGraph,包括FilterGraph Manager的创建,其上面的各种控制接口。根据用户选择的源文件,创建相应的回放FilterGraph。处理Filter Graph的事件。实现进度条的随即拖动。实现方式为:用一个定时器,不断地调用IMediaSeeking:GetCurrentPosition接口方法获得当前的时间播放点,然后根据媒体文件的总时间长度,计算进度的百分比,再转化为进度控件的当前位置值。当用户拖动进度快到一个新位置后,得到进度值,然后转化为时间点,调用接口方法进行设置

34、。于是能进行继续播放。抓取图片,直接使用SnapshotBitmap函数。具体实现如下所示:void CSimplePlayerDlg:OnButtonOpen() / 打开视频文件目前支持各种格式的文件CString strFilter = AVI File (*.avi)|*.avi|;strFilter += MPEG File (*.mpg;*.mpeg)|*.mpg;*.mpeg|;strFilter += Mp3 File (*.mp3)|*.mp3|;strFilter += Wave File (*.wav)|*.wav|;strFilter += All Files (*.*

35、)|*.*|;CFileDialog dlgOpen(TRUE, NULL, NULL, OFN_PATHMUSTEXIST | OFN_HIDEREADONLY, strFilter, this);if (IDOK = dlgOpen.DoModal() mSourceFile = dlgOpen.GetPathName();/ Rebuild the file playback filter graphCreateGraph();void CSimplePlayerDlg:OnButtonPlay() /进行视频播放if (mFilterGraph)mFilterGraph-Run();/

36、 Start a timerif (mSliderTimer = 0)mSliderTimer = SetTimer(SLIDER_TIMER, 100, NULL);void CSimplePlayerDlg:OnButtonPause() /实现暂停视频功能if (mFilterGraph)mFilterGraph-Pause();/ Start a timerif (mSliderTimer = 0)mSliderTimer = SetTimer(SLIDER_TIMER, 100, NULL); void CSimplePlayerDlg:OnButtonGrab() /实现抓图功能i

37、f (mFilterGraph)/ Firstly grab a bitmap to a temp filechar szTemp = C:mysnapshot.bmp;if (mFilterGraph-SnapshotBitmap(szTemp)/ User can browser for a new file hereCString strFilter = BMP File (*.bmp)|*.bmp|;CFileDialog dlgOpen(FALSE, .bmp, NULL, OFN_HIDEREADONLY, strFilter, NULL);if (IDOK = dlgOpen.D

38、oModal() :CopyFile(szTemp, dlgOpen.GetPathName(), FALSE);:DeleteFile(szTemp);将视频保存于本地文件夹中的代码如图所示,直接打开已经生成的amcap.exe文件。void CAVDConfDlg:OnAppcall() HINSTANCE s=ShellExecute(NULL,open, amcap.exe,NULL,.,SW_SHOWDEFAULT);4.2.5程序运行结果总程序框图如图所示视频采集传输请求界面如图:在框中输入IP地址连接请求界面如图:连接成功后界面如图所示:扩展功能如图所示,一简易播放器,能实现播放

39、支持多种格式的视频格式(如MPEG4,MPEG2,MPEG1,H.261,H.263.H.264,AVI,rm等),回放,摘拍。5.设计问题及解决:5.1 Graph Edit 通过本次课程设计,我学会了如何使用Directshow的GraphEdit来建立和测试Filter,使用GraphEdit,可以查看到系统中所有(正常)安装的Filter。执行菜单命令Graph | Insert Filters,查看到系统中安装的Filter。在连接Filter时,预先插入所有需要的Filter;连接时,在上一级Filter的输出Pin上按下鼠标左键并按住不放,拖动鼠标到下一级Filter的输入Pin

40、上后放开;这样依次连接所有必要的Pin即可。当Filter Graph构建完成后,就可以进行播放了。执行菜单命令Graph | Play或Pause或Stop;或者直接使用工具条上的播放控制按钮。所构建的filter如图所示5.2 配置平台本次设计需要配置DirectShow平台。由于对VC+6.0不熟悉,导致在编译baseclasses生成静态库时,选择DEBUG_UNICODE生成Strmbasd.lib,导致每次运行DX90里面的工程文件都缺少strmbasd.lib文件而导致不能运行。通过上网查找资料以及认真阅读文献材料了解需要使用选择DEBUG和RELEASE进行编译。同时,我也清楚

41、了解了DEBUG和RELEASE 的区别。Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。当使用DEBUG和RELEASE生成strmbasd.lib时,可以正确执行工程文件。配置好文件后,还要按照顺序添加库文件。如果不按书上顺序添加库文件,也会发生编译错误。原因是他查找库的时候是按照配置时的顺序执行。若顺序不对,则他查找时可能查找上一个库从而导致编译错误。5.3 filter依赖于dll的问题因为使用MFC进行界面编辑,所以会用到MFC的dl

42、l。然而很多普通PC不存在MFC的DLL文件,导致本程序的可植入性不强。通过在一个没有VC平台的电脑上进行测试,发现缺少很多MFC的DLL文件。通过测试,发现只要把DLL文件放入文件根目录下就能解决问题。这样就能使开发文件使用DLL文件。5.4抓图错误问题在测试SIMPLEPLAYER时,发现抓出来的图片无法识别,通过上网查找资料,发现源代码有错误。原因是hdr.bfOffBits计算错了。测试过程如下:把原来的代码进行修正:/原来的代码intnColors=1biBitCount;if(nColors256)nColors=0;/新改的代码intnColors=0;if(lpbi-biBit

43、Count=8)nColors=1biBitCount;其中biBitCount表示的是每个像素的位数,nColors表示调色板中的颜色个数。通过修正之后发现可以抓取图片,且能保存为BMP格式的图片。5.5 初始化设备问题在程序设计时,在采集图像时发现每当运行时总是出现错误。通过DEBUG发现错误总是在GetNumberOfCapabilities报异常。而在BUILD时没有任何错误和警告。通过上网查找有关资料,发现此异常问题是由于不能初始化摄像头设备所导致的。原因是在xp环境下获取输出pin时若是中文名字则不能完成初始化设备。从而导致不能进行运行程序。解决方法是对于capturefilter

44、上的outputpin,有一种获取Pin的方法,即通过pin的category,可以很方便地获取capturepin或previewpin。这样也可以避免pin的名字是英文或是中文引起的问题。加入如下代码后,视频即正常得以捕获。IPin*UFilterUtils:GetPin(IBaseFilter*inFilter,BOOLinInput,constchar*inPartialName)PIN_DIRECTIONdirection=inInput?PINDIR_INPUT:PINDIR_OUTPUT;IPin*foundPin=NULL;if(inFilter)IEnumPins*pinEn

45、um=NULL;if(SUCCEEDED(inFilter-EnumPins(&pinEnum)pinEnum-Reset();IPin*pin=NULL;ULONGfetchCount=0;while(!foundPin&SUCCEEDED(pinEnum-Next(1,&pin,&fetchCount)&fetchCount)if(pin)PIN_INFOpinInfo;if(SUCCEEDED(pin-QueryPinInfo(&pinInfo)if(pinInfo.dir=direction)/Ignorethepinnameif(!inPartialName)pin-AddRef()

46、;foundPin=pin;elsecharpinName128;:WideCharToMultiByte(CP_ACP,0,pinInfo.achName,-1, pinName,128,NULL,NULL);if(:strstr(pinName,inPartialName) pin-AddRef();foundPin=pin;/addbyyuanforwinxpbeginif(foundPin=NULL)if(strcmp(inPartialName,Capture)=0)if(:strstr(pinName,捕获)pin-AddRef();foundPin=pin; /addbyyuan

47、forwinxpendpinInfo.pFilter-Release();pin-Release();pinEnum-Release();/Wedontkeepoutstandingreferencecountif(foundPin)foundPin-Release();returnfoundPin;5.6总体认知同时,通过本次软件设计,让我了解到了什么是direceshow,p2p和VC+6.0开发平台。我能通过调试完成功能的测试。同时,通过本次设计让我学会了许多有关类和封装的知识,我也学会如果实现进度条以及实现截图。我也更深刻的认识了P2P以及RTP网络协议,能够通过网络协议完成开发工作。DirectX技术是瞄准多媒体应用开发的一套开发平台,而且它与WINDOWS兼容性很好。所以利用DirectX中的DirectShow来作为视频数据处理时一个很好的选择。参考文献:1陆其名. DirectShow开发指南 M.北京: 清华大学出版社2陆其名. DirectShow实务精选 M.北京: 清华大学出版社3刘若愚.基于DirectShow的p2p流媒体播放器的实现.J.淮南师范学院学报,2007,43(3),118-120

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!