山西大学商务学院本科毕业论文(设计)
thread = SDL_CreateThread(thread_func, this); if ( thread == NULL ) {
fprintf(stderr, \无法创建线程: %s\\n\ return; }
//SDL_WaitThread(thread, NULL); } }
5.3.2 双缓存显示机制
本客户端启用线程调用SDL显示,在窗口画法中加入双缓存机制,提高在客户端窗口中的显示速度,从视觉上保证显示质量! Try { {
std::cerr << \ SDL_Quit(); return -1; }
SDL_Flip实现见附录! 6.系统测试 6.1 系统运行环境 6.1.1 硬件配置 客户端(PC机配置)
处理器:Inter Pentium 4 1.6GHz或更高 内存:1G以上 硬盘空间:80GB 显卡:VGA显示适配器 操作系统:LINUX CentOS5 服务器端(ARM板配置) ARM9开发板:SC2440 摄像头: 6.1.2 软件环境
开发系统:LINUX CentOS5 开发工具:Qt Creator 4.7.1
环境配置包含库:SDL库、ffmpeg库、V4L库 6.2 测试环境
操作系统:LINUX CentOS5 工具包:Qt Creator 4.7.1
11
if ( SDL_Flip(pScreen) != 0 ) // Show the SDL window's surface. throw SDL_GetError();
}
catch ( const char* s )
基于Qt的四路视频监控系统中客户端的设计与实现
6.3代码测试与调试
应用程序的调试在一个应用软件的开发中尤其重要,Qt Creator 4.7.1程序设计语言提供了一个功能强大的内置调试器,它主要包括断点、中断表达式、监视表达式、通过代码一次经过一个语句或一个过程、显示变量和属性的值。Qt Creator 4.7.1程序设计语言还可在运行过程中进行编辑、设置下一个执行语句以及在应用程序处于中断模式是进行过程测试等。
程序的调试主要是有助于了解在应用程序运行时正在发生的事情。调试工具提供了应用程序当前状态的快照,包括程序的用户界面的外观;程序运行时,过程中的变量、表达式和属性的值;过程如何被调用、调用的顺序及过程运行的结果。 6.4 系统运行测试
首先连接上摄像头,以此模拟真实的监控环境来完成测试。在测试的过程中出现了一些问题,在测试中产生异常,如变量未定义、出现二意性名称等,以及出现在调试过程中的一些错误,经过反复的修改代码,按照Qt Creator 4.7.1程序设计语言提供的错误信息,最后调试成功。 6.5 测试结果
通过利用摄像头来测试视频监控系统应用程序,根据结果可知视频监控系统基本可以实现对视频信息的采集存储和录制等操作,通过界面设置选项还可以对监控界面进行操作。四路视频可以稳定在客户端显示,画面清晰。测试结果如图6.1所示:
图6.1 系统测试结果
12
山西大学商务学院本科毕业论文(设计)
结语
短暂而又宝贵的毕业设计就要结束了。终于在大家的帮助下,通过自己的努力把毕业设计完成了。在当中我对它有了新的认识和了解。在本次设计的全过程中,涉及了各方面的知识,大大扩展了我的知识面,同时使我学会了如何使用所学的知识去解决一些实际的问题。
本系统完成初步的数据采集、编码、传输、解码、显示的工作,作为客户端的UI模块,能保证视频画面清晰流畅,界面友好,与服务端连接稳定。本客户端最大的优点就是视频显示采用双缓存机制,这样可以提高视频显示质量,在直观上不会造成画面中断,提高性能!但是,由于时间仓促和自己所学限制,本客户端界面设计不够华美,许多可扩展的功能没有在此界面中实现。
本次设计,仅仅是一个基于四路的视频监控,在以后可以作为多路视频监控去扩展和改进,还有界面设计不是很精致,可以再润色使其更加美观。本客户端只是实现了基本的视频画面显示、监控IP设置等功能,以后的扩展时可以增加画面截图、视频保存等等相关操作。
在这次的设计中我学到了很多书本上学不到的东西,使我受益非浅。使自己的动手能力得到很大提高。就要走出校门了,因此我对这次锻炼的机会很珍惜。
13
基于Qt的四路视频监控系统中客户端的设计与实现
致谢
在本次毕业设计中,我从指导老师张永奎老师、康华老师、刘燕老师身上学到了很多东西。他们认真负责的工作态度,严谨的治学精神和深厚的理论实践水平都使我们深感敬佩。他们无论是在理论上还是在实践中,都给予我很大的帮助,使我得到不少的提高,尤其是他们的责任心和为人师表所具备的爱心,在这次毕业设计表现无疑。这对于我以后的学习和工作都是一种帮助,感谢他们细心又耐心的辅导。还有我的班主任以及我的同学对我的帮助,只有他们的帮助我才能更好的完成本次的毕业设计。还要感谢我的家人,谢谢他们对我的支持和关心。 附录 /*
* Performs hardware double buffering, if possible, or a full update if not. */
int SDL_Flip(SDL_Surface *screen) {
14
SDL_VideoDevice *video = current_video; /* Copy the shadow surface to the video surface */ if ( screen == SDL_ShadowSurface ) {
SDL_Rect rect;
SDL_Palette *pal = screen->format->palette; SDL_Color *saved_colors = NULL;
if ( pal && !(SDL_VideoSurface->flags & SDL_HWPALETTE) ) {
/* simulated 8bpp, use correct physical palette */
山西大学商务学院本科毕业论文(设计)
saved_colors = pal->colors; if ( video->gammacols ) { /* gamma-corrected palette */ pal->colors = video->gammacols; } else if ( video->physpal ) {
/* physical palette different from logical */ pal->colors = video->physpal->colors;
}
}
rect.x = 0; rect.y = 0; rect.w = screen->w; rect.h = screen->h;
if ( SHOULD_DRAWCURSOR(SDL_cursorstate) ) { SDL_LockCursor();
SDL_DrawCursor(SDL_ShadowSurface); SDL_LowerBlit(SDL_ShadowSurface, &rect,
SDL_VideoSurface, &rect);
SDL_EraseCursor(SDL_ShadowSurface); SDL_UnlockCursor();
} else {
SDL_LowerBlit(SDL_ShadowSurface, &rect,
SDL_VideoSurface, &rect);
}
if ( saved_colors ) { pal->colors = saved_colors; }
/* Fall through to video surface update */ screen = SDL_VideoSurface;
}
if ( (screen->flags & SDL_DOUBLEBUF) == SDL_DOUBLEBUF ) { SDL_VideoDevice *this = current_video;
return(video->FlipHWSurface(this, SDL_VideoSurface)); } else {
SDL_UpdateRect(screen, 0, 0, 0, 0);
} return(0);
}
15