音视频采集系统的设计论文_第1页
音视频采集系统的设计论文_第2页
音视频采集系统的设计论文_第3页
音视频采集系统的设计论文_第4页
音视频采集系统的设计论文_第5页
已阅读5页,还剩48页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

聊城大学本科毕业论文(设计)目录前言 31.系统的方案选择与论证 41.1音频部分 41.2图像显示部分 42.系统的总体设计 43.系统的硬件设计 53.1cortexA8实验仪概述 53.2USB2.0HOST接口 63.3串口 73.4摄像头 83.5音频输出接口和麦克风 93.6液晶屏输出接口 104系统的软件设计 114.1软件开发平台 114.1.1sourceinsight 114.1.2glade 124.2软件设计概述 124.3系统主程序 124.4系统子程序 134.4.1录音子程序 134.4.2拍照/录像子程序 145设计创新 155.1创新之一 155.2创新之二 15结论 16参考文献 17附录 18致谢 50摘要本设计模拟手机的录音、拍照、录像功能,实现了音视频数据的采集。使用cortexA8实验仪,通过话筒和摄像头分别对声音和图像进行采集。用话筒录声音,用喇叭播放声音。用摄像头实时显示图像,随时可以拍照或录制视频,用液晶屏显示拍下的图片和录下的视频。完成了对音频、视频、图片等数据的采集,转换,存储和应用,整体上实现了数码设备的娱乐功能[1]。关键词:cortex;A8实验仪;话筒;摄像头;液晶屏AbstractDesignsimulationmobilephonerecordings,photographs,videofunctions,toachievecollectionofaudioandvideodata.UsecortexA8experimentalinstrument,soundandimageswerecollectedbythemicrophoneandcamera.Recordsoundusingamicrophonewithspeakersplaythesound.Displaywithreal-timecameraimages,readytotakepicturesorrecordvideowiththeLCDdisplaycapturedimagesandrecordedvideos.Itcancollecttheaudio,video,photographs dataandtransformstorageandapply,whichrealizedtheentertainmentofdigitinstrument.KeywordscortexA8;experimental;instrument;microphone;camera;LCDscreen音视频数据采集系统的设计前言随着科学技术的飞速发展,越来越多的领域需要用到音视频数据采集技术,例如电视、电脑、视频监控,尤其是在手机数码领域。拍照、听音乐、看视频是现在的智能手机必不可少的功能,人们在节假日外出旅游的时,可以随时用手机拍下美丽的风景,在业余时间可以用手机听听音乐,看看电影。综上可知,音视频数据采集技术已经应用到人们日常生活的方方面面[2]。本设计是音视频数据采集,模拟手机的拍照、录音、录像功能,使用凌阳公司提供的cortexA8实验仪,通过编写程序使实验仪的话筒进行录音,并用喇叭播放录制的音频,把摄像头插到实验仪上,通过编写程序使摄像头采集的图像显示在液晶屏上,并随时可以进行拍照。由自然音源通过采集电路(麦克风)得到的音频信号是一种连续变化的模拟信号。但计算机只能处理和记载数字信号。音频信号必须变换为数字信号之后,才能由计算机进一步处理[3]。录音时,先设置好采样频率、采样位数、声道数,再启动声卡的AD芯片,将音频的模拟信号转化为数字信号,最后将音频对应的数字信号存储到文件中。放音时需要依据录音时声卡的采样频率、采样位数、声道数去设置声卡,再将音频的数字信号通过声卡的DA芯片转化为音频对应的模拟信号[4]。 视频是连续渐变的静态图像沿时间轴依次更换显示而形成的画面。显示图像时,若图像每秒变化超过24次,根据余晖效应,此时人眼无法辨别单幅的静态图像,一张一张静态的图像看上去是连续的运动的。通过V4L2编程框架,内核为应用程序提供了访问音、视频设备的统一接口。V4L2支持多种设备,其主要用于音频的采集,视频的输入及输出。在Linux中,通过V4L2接口操作视频设备可以像访问普通文件一样对设备文件进行读写[5]。本系统采用嵌入式技术,控制精度和效率高,稳定性好,操作方便,显示直观,很好的模拟了手机的拍照、录音、录像功能。1.系统的方案选择与论证1.1音频部分在此次设计中,对于音频部分,音频接口可以选用OSS或ALSA。方案一:采用OSS音频接口来实现。OSS可移植性好,但具有声卡独占问题,不支持混音。两个基于OSS的应用程序不能同时驱动声卡,也就没法同时发出声音。方案二:采用ALSA音频接口来实现。ALSA具有声卡共享的特性,支持混音,兼容OSS接口。两个基于ALSA的不同应用程序能同时驱动声卡,就是说能同时发出声音。ALSA是一个完全开放源代码的音频驱动程序集,除了像OSS那样提供了一组内核驱动程序模块之外,ALSA还专门为简化应用程序的编写提供了相应的函数库,与OSS提供的基于ioctl的原始编程接口相比,ALSA函数库使用起来要更加方便一些[6]。利用该函数库,开发人员可以方便快捷的开发出自己的应用程序,细节则留给函数库内部处理。综合分析,采用方案二作为音频部分的音频接口。1.2图像显示部分方案一:通过帧缓冲显示图像。帧缓冲是Linux系统为显示设备提供的一个接口,它允许应用程序通过此接口访问图形设备,而不需关心底层硬件的差异。帧缓冲把显示设备描述成缓冲区,往显示缓冲区写入数据,屏幕上会有相应的显示。但图像的大小不能随意修改。方案二:通过gtk显示图像。可以自由指定图像的大小,将摄像头输出的rgb数据通过函数gtk_draw_rgb_image();加载到绘图区,可以指定绘图区的大小,从而改变图像的大小。综合分析,采用方案二来显示图像。2.系统的总体设计能够录音并存储为音频文件。(2)播放已经存在的音频文件。(3)视频采集与显示,能够实时从摄像头中 获取图像并将摄像头获得的帧数据显示到屏幕上。(4)视频采集与显示,能够实时从摄像头中获取图像并将摄像头获得的帧数据显示到屏幕上。(5)拍照,保存为bmp照片。(6)图片浏览,能够显示存储的bmp图片。(7)录像,存储摄像头获得的数据,保存为视频。(8)播放录像,能够将存储的视频播放出来。3.系统的硬件设计3.1cortexA8实验仪概述该实验仪是凌阳教育继S3c2440之后的又一力作,是一个标准的嵌入式开发平台。处理器采用业界领先的cortexA8,其内部集成了丰富的模块,另外该芯片主频高达833MHZ,您可以轻松上手linux、wince、android等操作系统的设计及开发。本开发板基于开发考虑,外设齐全,接口标准,扩展方便。整个开发板采用核心板加底板方法设计,核心板采用八层板设计,线路可靠稳定,是嵌入式学习和研究的最佳选择,该实验仪适合研究人员和电子爱好者用做评估与开发。核心板主要元件:CPU型号为S5PV210。DDR2内存,一共4片,型号为K4T1G164Q。NANDFLASH,1G版本核心板为K9K8G08,256M版本核心板为K9F2G08。有线网络芯片,10/100Mbps,SMSCLAN9220。AC97音频编解码芯片,WM9713,该芯片包含电阻式触摸屏控制器。电源转换芯片,为核心板器件提供所需要的各种电压转换。底板主要元器件:电源接口,输入电压为5V。电源上串联有一个1.1A的自恢复保险丝。电源开关,选用进口优质电源开关,可反复开关不低于10万次。USB2.0OTG接口,采用miniUSB插座,支持480Mbps高速模式。HDMI高清显示输出,标准的TypeA型HDMI插座,机械强度高。CVBS视频输出端口,用于连接电视机。100M有线以太网接口[7]。2路RS232电平串口插座,DB9针式插座,和PC串口标准一致。TF卡插座,支持从TF卡启动。板载USBWIFI模块(板载和外接二选一),支持802.11n150Mbps。3路预留USB2.0HOST端口,可以外接U盘,鼠标,键盘等。音频输出接口,采用3.5mm耳机插座。板载麦克风[17]。启动模式设置开关,可以设置多种启动模式。4个用户LED,由用户程序控制LED的亮灭。摄像头输入接口,可以连接定制的摄像头扩展板。液晶输出接口,可以外接各种液晶屏模块。RTC时钟电池[18]。GPIO扩展接口,包含2路串口,1路SPI,一个GPIO。9个用户按键,支持常用的功能操作[8]。1个复位按键。图1CortexA8试验仪核心板加底板3.2USB2.0HOST接口S5PV210只有1路USB2.0HOST端口,底板上通过USBHUB芯片GL850G扩展出4个USB2.0端口,其中一个用于板载WIFI接口,剩余3个是标准的USBA型接口插座,分别是J23,J24,J25。支持高速模式,也就是480Mbps。之前三星的S3C2440A和S3C6410的USBHOST最高只支持USB2.0全速(12Mbps)模式[9]。图2USB实物图图3USB电路图图4USB插座信号定义1:VCC(5V),为接入USB端口的设备提供电源2:USBD-,也用DM表示,USB差分信号-3:USBD+,也用DP表示,USB差分信号+4:GND 电源地[15]3.3串口S5PV210一共有四个串口,其中2个通过SP3232电平转换芯片连接到DB9插座。另外2个直接从CPU连接到开发板J17插座[16]。开发板上DB9插座:图5串口实物图图6串口电路图图7串口管脚定义开发板的DB9串口信号定义和PC的串口定义完全一样:2:RXD 接收信号,对于开发板来说是输入信号3:TXD 发送信号,对于开发板来说是输出信号5:GND 公共地3.4摄像头参数:高品质CMOS感应器。支持WindowsXPSP2/Vista等操作系统。支持手动式调焦。静态图像拍照:默认分辨率为640x480。视频录像捕捉:默认分辨率为640x480,软件增值可达到500万(2560x1920),YUY2输出格式。USB2.0高速传输,高帧速(30-15fps)视频播放,画面流畅不停顿。自动白平衡、曝光。最小灵敏度:2.0V/Lux.Sec。闪烁控制:50Hz或60Hz自动识别。支持抓取、储存静态照片(JPG格式)功能。支持QQ、MSN、雅虎通等视频聊天软件,等视频聊天室。工作温度:-10~60℃。功耗:<0.5W。图8摄像头实物图3.5音频输出接口和麦克风音频输出端口(J11)为标准3.5mm立体声耳机插座,接到AC97编解码芯片WM9713的音频输出。麦克风(MIC1)也是接到WM9713。图9编解码芯WM9713电路图当耳机插入耳机插座时候,耳机插头的金属部分会把耳机插座的第3脚和第4脚短接。第3脚是地线,这样相当于把第4脚接地,而第4脚和喇叭的功放使能引脚相连接,第4脚接地时候为低电平,喇叭功放就停止工作。也就是说,耳机插入插座会自动禁止喇叭的声音[14]。3.6液晶屏输出接口液晶屏输出接口(J9)用于连接各种液晶屏,包含了液晶屏数据信号,背光电源和触摸屏这3个部分。图10液晶屏输出接口液晶屏接口插座使用的是0.5mm间距40芯FPC插座,下接触。插入FPC带线时候,要把FPC带线的金属接触面朝下。FPC插座左边为第1脚(白色三角形)[13]。LCD的35脚LCDSEL是一个识别5寸和7寸液晶屏的引脚,电路板上有一个下拉电阻。对于5寸的液晶屏模块,这个引脚是空脚,所以是低电平。对于7寸液晶屏,35脚是接高电平。因为5寸液晶屏和7寸液晶屏分辨率是一样的,只是背光电流要求不同,所以LCDSEL用于控制背光电流的大小[12]。LCDSEL为低电平情况,Q9不导通,背光电流I=0.1/R=0.1/3.3=0.03A=30mA。LCDSEL为高电平情况,Q9导通,R27和R26并联,R=R27*R26/(R27+R26)=1R,背光电流I=0.1/R=0.1/1=0.1A=100mA[10]。图11液晶屏电路图4系统的软件设计4.1软件开发平台4.1.1sourceinsightSourceInsight是一个面向项目开发的程序编辑器和代码浏览器,它拥有内置的对C/C++,C#和Java等程序的分析。SourceInsight能分析你的源代码并在你工作的同时动态维护它自己的符号数据库,并自动为你显示有用的上下文信息。SourceInsight不仅仅是一个强大的程序编辑器,它还能显示referencetrees,classinheritancediagrams和calltrees。SourceInsight提供了最快速的对源代码的导航和任何程序编辑器的源信息。SourceInsight提供了快速和革新的访问源代码和源信息的能力。与众多其它编辑器产品不同,SourceInsight能在你编辑的同时分析你的源代码,为你提供实用的信息并立即进行分析。SourceInsight是如今最好用的语言编辑器,支持几乎所有的语言,如C、C++、ASM、PAS、ASP、HTML等常见的,还支持自己定义关键字,如果您是一个程序员或者网页制作人,这个软件对您都是有帮助的!SourceInsight为您提供了可快速访问源代码和源信息的功能。SourceInsight相较其它的编辑器产品来说,还可以帮您分析源代码,并在您编辑的同时立刻提供给您有用的信息和分析。SourceInsight自动创建并维护它自己高性能的符号数据库,包括函数、method、全局变量、结构、类和工程源文件里定义的其它类型的符号。SourceInsight可以迅速地更新您的文件信息,即使在您编辑代码的时候。而且符号数据库的符号可以自动创建倒您的工程文件中。4.1.2gladeGlade是GTK+图形用户界面产生器。也就是说,Glade是个VisualProgrammingTool,和MicrosoftWindows平台的VisualTools类似,只要用鼠标拉一拉,它就会自动帮你产生Csourcecode。所以我们这些懒人,就不用再去为画面的设计烦恼,用Glade设计好画面,再用编辑器把程式码稍为修减就OK了。(现在也有各种语言如C++、Ada95、Python、Perl等的GTK+介面,如果搭配其它工具,也可以自动产生C++,Ada95,PythonandPerl的程式码)。4.2软件设计概述在此次设计中,音视频数据采集系统的软件全部采用c语言编写。采用模块化的思想,将程序划分为多个模块,便于设计、调试。此次设计中程序的编写环境是ubuntu操作系统。4.3系统主程序创建主界面及各个子界面,在主窗上添加视频按钮、音频按钮。实现界面间的切换,通过回调函数实现各个界面间的切换。创建主窗口显示背景创建主窗口显示背景创建拍照录像窗口创建录音放音窗口图片浏览窗口视频播放窗口开始图12主程序流程图4.4系统子程序4.4.1录音子程序在录音界面,增加录音按钮、播放按钮、返回按钮。当点击录音按钮时,开始录音,再次点击录音按钮停止,录音通过创建线程来实现。实现放音(可以单独去做界面),点击放音按钮或者直接点击列表中的声音文件名实现放音。返回按钮可以返回主界面。初始化音频设备/dev/dsp初始化录音窗口初始化音频设备/dev/dsp初始化录音窗口打开音频数据文件开线程,从设备中读取数据,并写入文件保存音频文件开线程,从文件中读取数据,写入设备中关闭音频文件4.4.2拍照/录像子程序在录像界面,当进入录像窗口时即可初始化v4l2摄像头设备。增加拍照按钮,录制视频按钮,图片/视频浏览按钮,返回按钮,以及图像显示“窗口”。获取摄像头数据在开发板屏幕显示(创建线程函数去操作),通过GTK在屏幕实时显示需要刷新绘图区域,通过gtk_widget_queue_draw()就会自动调用曝光事件所连接的回调函数,回调函数中刷新屏幕从而实现实时显示。GTK中的绘图函数只能够显示rgb格式的数据。需要将摄像头yuv数据转化成rgb数据[11]。实现拍照功能,点击拍照按钮,截取当前摄像头数据保存到图片中。图片格式转换函数:voidrgb24_to_bmp(unsignedchar*rgb24,char*bmp_name,intwidth,intheight);录像功能实现,点击录像按钮时创建线程,获取图像并写入视频文件。由于rgb数据是原始数据未压缩,直接存储rgb数据会导致视频文件很大,所以需要将rgb数据压缩,即将rgb格式的数据转化为jpg格式的数据进行存储。播放视频,添加线程,当点击播放按钮时,能够读取视频文件中的图像,并在窗口上显示(读出的数据为jpg格式,所以要将数据在转化为rgb格式。当退出拍照录像窗口时,撤销线程,关闭设备。图片浏览窗口类似。拍照、录像窗口拍照、录像窗口选择拍照or录像创建线程:不断从摄像头中获取图像。创建线程:不断触发曝光事件显示图像。录像,开线程将帧数据写文件write_file初始化v4l2拍照保存图片rgb24_to_bmprgb24_to_bmp关闭文件图14拍照/录像子程序流程图5设计创新5.1创新之一在音视频设计中,对窗体的设计加入了某些属性,如单双击,滑动窗体等,利用这些属性结合某些模块如,时间的控制和调整,可以替换掉按钮的单调操作,也使得界面变得简洁优雅。在利用窗体的单双击和滑动事件时要注意对窗体区域的划分,对不同的模块进行控制。5.2创新之二利用时间的值来控制背景图片的切换,例如每分钟有六十秒,如果让秒对29(也可以是其他值)取余,则每分钟会取到两次零值,这样就会触发两次事件来切换图片,也可以利用分钟的值,从而达到更长时间的切图效果。结论该音视频数据采集系统的设计,通过话筒和摄像头分别对声音和图像进行采集,经过开发板的处理,用喇叭播放声音,用液晶屏显图像。在此次设计中,通过理论课的实践和研讨,取得了初步成果,完成了话筒和摄像头采集数据,喇叭和液晶屏显示数据的过程。实践中,录制视频和播放视频是最难的部分,要把图片按一定的格式存储到文件里实现录制视频,把文件里的图片取出来通过液晶屏显示实现播放视频。参考文献[1]张绮文等.ARM嵌入式常用模块与综合系统设计实例精讲[M].北京:电子工业出版社, 2007.[2]张瑜,王益涵.ARM嵌入式程序设计[M].北京:北京航空航天大学出版社,2009.[3]杜春雷.ARM体系结构与编程[M].北京:清华大学出版社,2003.[4]潘巨龙,黄宁,姚伏天等.ARM9嵌入式Linux系统构建与应用[M].北京:北京航空航天大学 出版社,2006.[5]李新峰,何广生,赵秀文.基于ARM9的嵌入式Linux开发技术[M].北京:电子工业出版 社,2008.[6](美)W.RichardStevensBillFennerAndrewM.Rudoff.UNIX网络编程第3版[M].北京: 人民邮电出版社,2009.[7]ManufacturingEngineeringLaboratoryNationalInstituteofStandardsand TechnologyGaithersburg[M].U.S.A,2004.[8]尹柱霞,郑喜凤,于洪涛.ARM+FPGA控制的LED脱机屏系统设计[J].液晶与显示. 2010,21,5:23-25.[9]梁廷魁.RS485串行通讯在自动生产线上的应用[J].数字技术与应用.2011,15,6:45-47.[10]苏哲欣,刘鸿飞,薛晓.基于嵌入式Linux的LCD驱动分析与实现[J].工业控制计算机. 2009,12,3:28-29.[11]ITU-TRecommendation:Q.400.系列[12]Klessing.RW.OverviewofMetropolitanAreaNetworks.IEEECommunicationMagaine,1986,24(1):9-15.[13]AbramsonN.TheALOHASystem-AnotherAlternativeforComputerCommunication.Proc.FallJointComput.Conf.AFIPS,1970,37:281-285.[14]IEEE802.15WorkingGroupforWPAN.[15]AbramsonN.PacketSwitchingwithSatellites,AFIPSConf.Proc.,1973,42(6):695-702.[16]杨金岩,等.AT89系列单片机原理与接口技术.北京:人民邮电出版社,2005.1.[17]高峰.单片机微型计算机原理与技术接口.北京:科学出版社,2003.2.[18]郭天祥,新概念51单片机C语言教程,北京:电子工业出版社.附录A.主函数初始化全部窗口#include<gtk/gtk.h>#include"main_window.h"#include"picture_window.h"#include"play_wav_window.h"intmain(intargc,char*argv[]){ if(FALSE==g_thread_supported()){//如果线程没有初始化 g_thread_init(NULL); //初始化线程,g_thread_init()必须放在gdk_threads_init()前面 gdk_threads_init();//以上代码可以填写就可以使用任何其他线程并能够刷图 } gtk_init(&argc,&argv); window.main_window=design_main_window();//主窗口 window.video_window=design_video_window();//拍照和录像窗口 window.picture_window=design_pic_window();//图片窗口 window.play_video_window=design_play_video_window();//播放视频窗口 window.play_wav_window=design_play_wav_window();//播放wav音乐窗口*/ gtk_widget_show_all(window.main_window); gdk_threads_enter(); gtk_main(); //主事件循环 gdk_threads_leave(); return0;}初始化主界面和定义函数#include"main_window.h"#include"sungtk_interface.h"#include"play_wav_window.h"#include"play_video_window.h"MainButtonmainbutton;pthread_ttid_time;//滑屏坐标doublex_old=0;doubley_old=0;doublex_new=0;doubley_new=0;//时间处理参数gbooleantime_pthread_flag=FALSE;intntm_hour=10;intntm_min=8;intntm_sec=0;/********************************************************************功能: 主窗口显示可以选择录像、音乐、视频、照片*参数: 无*返回值: 主窗口指针********************************************************************/GtkWidget*design_main_window(){ GladeXML*gxml=glade_xml_new("../glade/main_window.glade",NULL,NULL); GtkWidget*main_window=glade_xml_get_widget(gxml,"main_window"); chang_background(main_window,"../image/main_win_pic.jpg",800,480); gtk_widget_add_events(main_window,GDK_BUTTON_PRESS_MASK| GDK_BUTTON_RELEASE_MASK); g_signal_connect(main_window,"button_press_event", G_CALLBACK(main_win_press),NULL); g_signal_connect(main_window,"button_release_event", G_CALLBACK(main_win_realse),NULL); mainbutton.video_button=glade_xml_get_widget(gxml,"video_button"); mainbutton.camer_button=glade_xml_get_widget(gxml,"camer_button"); mainbutton.music_button=glade_xml_get_widget(gxml,"music_button"); mainbutton.pic_button=glade_xml_get_widget(gxml,"pic_button"); sungtk_button_inset_image(mainbutton.video_button,"../image/Videos.png",80,80); sungtk_button_inset_image(mainbutton.camer_button,"../image/camer_button_pic.p ng",80,80); sungtk_button_inset_image(mainbutton.music_button,"../image/music_button_pic.p ng",80,80); sungtk_button_inset_image(mainbutton.pic_button, "../image/picture_button_pic.png",80,80); mainbutton.data_label=glade_xml_get_widget(gxml,"data_label"); sungtk_widget_set_font_size(mainbutton.data_label,20,FALSE); gtk_label_set_text((GtkLabel*)(mainbutton.data_label),"2014/5/25"); mainbutton.time_label=glade_xml_get_widget(gxml,"time_label"); sungtk_widget_set_font_size(mainbutton.time_label,40,FALSE); pthread_create(&tid_time,NULL,current_time,NULL); pthread_detach(tid_time); signal_connect_button(); returnmain_window;}/***********************************************************************功能: 单双击窗体事件*参数: 无*返回值: FALSEorTRUE**********************************************************************/gbooleanmain_win_press(GtkWidget*widget,GdkEventButton*event,gpointerdata){ x_old=event->x; y_old=event->y; if(event->type==GDK_2BUTTON_PRESS) { if(time_pthread_flag==FALSE) { pthread_cancel(tid_time); time_pthread_flag=TRUE; printf("doubleclickedcancel\n"); } else { pthread_create(&tid_time,NULL,current_time,NULL); pthread_detach(tid_time); time_pthread_flag=FALSE; printf("doubleclickedwork\n"); } } returnTRUE;}/********************************************************************功能: 按钮信号连接函数*参数: 无*返回值: 无*********************************************************************/voidsignal_connect_button(){ g_signal_connect(G_OBJECT(mainbutton.camer_button),"clicked",G_CALLBACK(deal_camer_button_press),NULL); //播放视频 g_signal_connect(G_OBJECT(mainbutton.video_button),"clicked",G_CALLBACK(deal_video_button_press),NULL); g_signal_connect(G_OBJECT(mainbutton.music_button),"clicked",G_CALLBACK(deal_wav_button_press),NULL); g_signal_connect(G_OBJECT(mainbutton.pic_button),"clicked",G_CALLBACK(deal_pic_button_press),NULL);}gbooleanmain_win_realse(GtkWidget*widget,GdkEventButton*event,gpointerdata){ charbuff[100]=""; x_new=event->x; y_new=event->y; if(time_pthread_flag==TRUE) { if((x_new<=170)||(x_old<=170)) { //时的分区 if(y_new-y_old>100) { ntm_hour--; if(ntm_hour<0) { ntm_hour=12; } } elseif(y_old-y_new>100) { ntm_hour++; if(ntm_hour>=13) { ntm_hour=0; } } } elseif((170<x_new)&&(x_new<=340)&&(170<x_old)&&(x_old<=340)) { //分的分区 if(y_new-y_old>100) { ntm_min--; if(ntm_min<0) { ntm_min=59; } } elseif(y_old-y_new>100) { ntm_min++; if(ntm_min>=60) { ntm_min=0; } } } elseif((340<x_new)&&(x_new<=500)&&(340<x_old)&&(x_old<=500)) { //秒的分区 if(y_new-y_old>100) { ntm_sec--; if(ntm_sec<0) { ntm_sec=59; } } elseif(y_old-y_new>100) { ntm_sec++; if(ntm_sec>=60) { ntm_sec=0; } } } } sprintf(buff,"%02d:%02d:%02d",ntm_hour,ntm_min,ntm_sec); gdk_threads_enter(); //进入多线程互斥区域 gtk_label_set_text((GtkLabel*)(mainbutton.time_label),buff); gdk_threads_leave();}/*********************************************************************功能: 线程函数显示时间*参数: NULL*返回值: NULL*******************************************************************/void*current_time(){ charbuff[100]=""; while(1) { if(60<=ntm_sec){ ntm_sec=0; ntm_min++; if(60<=ntm_min){ ntm_min=0; ntm_hour++; if(13<=ntm_hour){ ntm_hour=1; } } } sprintf(buff,"%02d:%02d:%02d",ntm_hour,ntm_min,ntm_sec); gdk_threads_enter(); //进入多线程互斥区域 gtk_label_set_text((GtkLabel*)(mainbutton.time_label),buff); gdk_threads_leave(); ntm_sec++; sleep(1); } returnNULL;}B.图片浏览窗口设置#include"picture_window.h"#include"sungtk_interface.h"#include"main_window.h"#include"play_wav_window.h"PictureButtonpicturebutton;//照片相关参数intbmp_total=0;intcurrent_bmp_num=0;char*bmp_name[100];charcurrent_bmp[100]="";staticgints_timer=-1;gbooleanauto_play_flag=FALSE;/*********************************************************************功能: 进入图片浏览并创建此界面*参数: widget:被点击的按钮*返回值: 无********************************************************************/voiddeal_pic_button_press(GtkWidget*widget,gpointerdata){ bmp_total=find_file("../picture/",".bmp",bmp_name); if(bmp_total!=0) { current_bmp_num=bmp_total-1; sprintf(current_bmp,"../picture/%s",bmp_name[current_bmp_num]); } printf("%s\n",current_bmp); sungtk_image_load_picture(picturebutton.pic_image,current_bmp,700,480); gtk_widget_hide_all(window.main_window); gtk_widget_show_all(window.picture_window);}/**********************************************************************功能: 设置图片浏览窗口*参数: 无*返回值: 返回被设置的窗口*********************************************************************/GtkWidget*design_pic_window(){ GladeXML*gxml=glade_xml_new("../glade/picture_window.glade",NULL,NULL); GtkWidget*picture_win=glade_xml_get_widget(gxml,"picture_window"); chang_background(picture_win,"../image/pic_back.jpg",800,480); picturebutton.pic_image=glade_xml_get_widget(gxml,"pic_image"); picturebutton.play_picture_button= glade_xml_get_widget(gxml,"play_picture_button"); picturebutton.last_picture_button=glade_xml_get_widget(gxml,"last_picture_button"); picturebutton.next_picture_button= glade_xml_get_widget(gxml,"next_picture_button"); picturebutton.delete_pic_button=glade_xml_get_widget(gxml,"delete_pic_button"); picturebutton.back_button=glade_xml_get_widget(gxml,"back_button"); sungtk_button_inset_image(picturebutton.play_picture_button,"../image/pplay.png",80,80); sungtk_button_inset_image(picturebutton.last_picture_button,"../image/pprevious.png",80,80); sungtk_button_inset_image(picturebutton.next_picture_button,"../image/pnext.png",80,80); sungtk_button_inset_image(picturebutton.delete_pic_button,"../image/delete_pic.png",80,80); sungtk_button_inset_image(picturebutton.back_button,"../image/home_win.png",80,80); signal_connect_picture_button(); returnpicture_win;}/********************************************************************功能: 按钮信号连接函数*参数: 无*返回值: 无********************************************************************/voidsignal_connect_picture_button(){ g_signal_connect(G_OBJECT(picturebutton.play_picture_button),"clicked",G_CALLBACK(deal_auto_play_pic_button_press),NULL); g_signal_connect(G_OBJECT(picturebutton.last_picture_button),"clicked",G_CALLBACK(deal_hand_play_pic_button_press),NULL); g_signal_connect(G_OBJECT(picturebutton.next_picture_button),"clicked",G_CALLBACK(deal_hand_play_pic_button_press),NULL); g_signal_connect(G_OBJECT(picturebutton.back_button),"clicked",G_CALLBACK(deal__pic_back_button_press),NULL); g_signal_connect(G_OBJECT(picturebutton.delete_pic_button),"clicked",G_CALLBACK(deal_delete_pic_button_press),NULL);}/*********************************************************************功能:自动 播放图片*参数: widget:被点击的按钮*返回值: 无********************************************************************/voiddeal_auto_play_pic_button_press(GtkWidget*widget,gpointerdata){ if(auto_play_flag==FALSE) { auto_play_flag=TRUE; sungtk_button_inset_image(picturebutton.play_picture_button,"../image/ppause.png",80,80); s_timer=gtk_timeout_add(1000,change_image,picturebutton.pic_image); } else { auto_play_flag=FALSE; gtk_timeout_remove(s_timer); sungtk_button_inset_image(picturebutton.play_picture_button,"../image/pplay.png",80,80); }}/*********************************************************************功能: 手动播放图片回调函数*参数: widget:被点击的按钮*返回值: 无********************************************************************/voiddeal_hand_play_pic_button_press(GtkWidget*widget,gpointerdata){ if(widget==picturebutton.last_picture_button) { if(current_bmp_num>0) { current_bmp_num--; } } elseif(widget==picturebutton.next_picture_button) { if(current_bmp_num<bmp_total-1) { current_bmp_num++; } } sprintf(current_bmp,"../picture/%s",bmp_name[current_bmp_num]); sungtk_image_load_picture(picturebutton.pic_image,current_bmp,700,480);}/*********************************************************************功能: 自动播放图片*参数: data:播放图片的画图区域*返回值: 无********************************************************************/gbooleanchange_image(gpointerdata){ if(current_bmp_num<bmp_total-1) { current_bmp_num++; } else { current_bmp_num=0; } sprintf(current_bmp,"../picture/%s",bmp_name[current_bmp_num]); sungtk_image_load_picture(picturebutton.pic_image,current_bmp,700,480); returnTRUE;}/*********************************************************************功能:图片播放返回窗口*参数:NULL*返回值: NULL********************************************************************/void*deal__pic_back_button_press(){ if(auto_play_flag==TRUE) { auto_play_flag=FALSE; gtk_timeout_remove(s_timer); sungtk_button_inset_image(picturebutton.play_picture_button,"../image/pplay.png",80,80); } gtk_widget_hide_all(window.picture_window); gtk_widget_show_all(window.main_window); returnNULL;}/*********************************************************************功能:图片删除*参数:NULL*返回值: NULL********************************************************************/void*deal_delete_pic_button_press(){ sprintf(current_bmp,"../picture/%s",bmp_name[current_bmp_num]); if(remove(current_bmp)) printf("deletepictureerror!\n"); bmp_total=find_file("../picture/",".bmp",bmp_name); returnNULL;}C.视频播放窗口#include"play_video_window.h"#include"sungtk_interface.h"#include"wav.h"#include"window.h"#include"yuyv_rgb_jpeg.h"intvideo_total=0;intcurrent_video_num=0;char*video_name[100];constchar*video_path="../video/";charcurrent_video[100]="";pthread_tplay_video,p_play_video;staticintbmp_width=0; staticintbmp_height=0;staticunsignedchar*rgbvideo=NULL;staticsem_tsem_1,sem_2,sem_3;gbooleanplay_video_flag=FALSE;gbooleanvideo_in_flag=FALSE;/*********************************************************************功能:播放视频按钮回调函数*参数: 无*返回值: 无********************************************************************/voiddeal_video_button_press(){ if(video_in_flag==TRUE) { pthread_create(&play_video,NULL,start_play_video,NULL); pthread_detach(play_video); } video_total=player_song_list_display(video_path); gtk_widget_hide_all(window.main_window); gtk_widget_show_all(window.play_video_window); }/*********************************************************************功能:读取文件夹中的视频文件*参数: 无*返回值: 无********************************************************************/intplayer_song_list_display(constchar*path){ DIR*dir=NULL; structdirent*ptr=NULL; intsong_num=0; dir=opendir(path); if(dir==NULL){ perror("opendir"); return-1; } playvideobutton.clist=sungtk_clist_new(); gtk_fixed_put((GtkFixed*)(playvideobutton.video_fixed),playvideobutton.clist->fixed,0,0); sungtk_clist_set_text_size(playvideobutton.clist,15); sungtk_clist_set_col_width(playvideobutton.clist,300); sungtk_clist_set_row_height(playvideobutton.clist,23); sungtk_clist_set_select_row_signal(playvideobutton.clist,"button-release-event",callback_list_release); while((ptr=readdir(dir))!=NULL) //读歌曲名,存歌曲 { if(strstr(ptr->d_name,".mpg")!=NULL){ video_name[song_num]=(char*)malloc(strlen(ptr->d_name)+1); memset(video_name[song_num],0,strlen(ptr->d_name)+1); strcpy(video_name[song_num],ptr->d_name); sungtk_clist_append(playvideobutton.clist,ptr->d_name); song_num++; } } sungtk_clist_set_foreground(playvideobutton.clist,"black"); closedir(dir); returnsong_num;}/*********************************************************************功能: 播放视频线程*参数: NULL*返回值: NULL********************************************************************/void*start_play_video(char*video_name_path){ FILE*fp; if((fp=fopen(current_video,"rb+"))==NULL) { printf("Cannotopenfile!"); returnNULL; } rewind(fp); intjpeg_frame_size=0; while(play_video_flag==TRUE) { sem_wait(&sem_3); gdk_threads_ent

温馨提示

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

评论

0/150

提交评论