




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
聊城大學本科畢業(yè)論文(設計)目錄前言 31.系統(tǒng)的方案選擇與論證 41.1音頻部分 41.2圖像顯示部分 42.系統(tǒng)的總體設計 43.系統(tǒng)的硬件設計 53.1cortexA8實驗儀概述 53.2USB2.0HOST接口 63.3串口 73.4攝像頭 83.5音頻輸出接口和麥克風 93.6液晶屏輸出接口 104系統(tǒng)的軟件設計 114.1軟件開發(fā)平臺 114.1.1sourceinsight 114.1.2glade 124.2軟件設計概述 124.3系統(tǒng)主程序 124.4系統(tǒng)子程序 134.4.1錄音子程序 134.4.2拍照/錄像子程序 145設計創(chuàng)新 155.1創(chuàng)新之一 155.2創(chuàng)新之二 15結論 16參考文獻 17附錄 18致謝 50摘要本設計模擬手機的錄音、拍照、錄像功能,實現(xiàn)了音視頻數(shù)據(jù)的采集。使用cortexA8實驗儀,通過話筒和攝像頭分別對聲音和圖像進行采集。用話筒錄聲音,用喇叭播放聲音。用攝像頭實時顯示圖像,隨時可以拍照或錄制視頻,用液晶屏顯示拍下的圖片和錄下的視頻。完成了對音頻、視頻、圖片等數(shù)據(jù)的采集,轉換,存儲和應用,整體上實現(xiàn)了數(shù)碼設備的娛樂功能[1]。關鍵詞:cortex;A8實驗儀;話筒;攝像頭;液晶屏AbstractDesignsimulationmobilephonerecordings,photographs,videofunctions,toachievecollectionofaudioandvideodata.UsecortexA8experimentalinstrument,soundandimageswerecollectedbythemicrophoneandcamera.Recordsoundusingamicrophonewithspeakersplaythesound.Displaywithreal-timecameraimages,readytotakepicturesorrecordvideowiththeLCDdisplaycapturedimagesandrecordedvideos.Itcancollecttheaudio,video,photographs dataandtransformstorageandapply,whichrealizedtheentertainmentofdigitinstrument.KeywordscortexA8;experimental;instrument;microphone;camera;LCDscreen音視頻數(shù)據(jù)采集系統(tǒng)的設計前言隨著科學技術的飛速發(fā)展,越來越多的領域需要用到音視頻數(shù)據(jù)采集技術,例如電視、電腦、視頻監(jiān)控,尤其是在手機數(shù)碼領域。拍照、聽音樂、看視頻是現(xiàn)在的智能手機必不可少的功能,人們在節(jié)假日外出旅游的時,可以隨時用手機拍下美麗的風景,在業(yè)余時間可以用手機聽聽音樂,看看電影。綜上可知,音視頻數(shù)據(jù)采集技術已經(jīng)應用到人們?nèi)粘I畹姆椒矫婷鎇2]。本設計是音視頻數(shù)據(jù)采集,模擬手機的拍照、錄音、錄像功能,使用凌陽公司提供的cortexA8實驗儀,通過編寫程序使實驗儀的話筒進行錄音,并用喇叭播放錄制的音頻,把攝像頭插到實驗儀上,通過編寫程序使攝像頭采集的圖像顯示在液晶屏上,并隨時可以進行拍照。由自然音源通過采集電路(麥克風)得到的音頻信號是一種連續(xù)變化的模擬信號。但計算機只能處理和記載數(shù)字信號。音頻信號必須變換為數(shù)字信號之后,才能由計算機進一步處理[3]。錄音時,先設置好采樣頻率、采樣位數(shù)、聲道數(shù),再啟動聲卡的AD芯片,將音頻的模擬信號轉化為數(shù)字信號,最后將音頻對應的數(shù)字信號存儲到文件中。放音時需要依據(jù)錄音時聲卡的采樣頻率、采樣位數(shù)、聲道數(shù)去設置聲卡,再將音頻的數(shù)字信號通過聲卡的DA芯片轉化為音頻對應的模擬信號[4]。 視頻是連續(xù)漸變的靜態(tài)圖像沿時間軸依次更換顯示而形成的畫面。顯示圖像時,若圖像每秒變化超過24次,根據(jù)余暉效應,此時人眼無法辨別單幅的靜態(tài)圖像,一張一張靜態(tài)的圖像看上去是連續(xù)的運動的。通過V4L2編程框架,內(nèi)核為應用程序提供了訪問音、視頻設備的統(tǒng)一接口。V4L2支持多種設備,其主要用于音頻的采集,視頻的輸入及輸出。在Linux中,通過V4L2接口操作視頻設備可以像訪問普通文件一樣對設備文件進行讀寫[5]。本系統(tǒng)采用嵌入式技術,控制精度和效率高,穩(wěn)定性好,操作方便,顯示直觀,很好的模擬了手機的拍照、錄音、錄像功能。1.系統(tǒng)的方案選擇與論證1.1音頻部分在此次設計中,對于音頻部分,音頻接口可以選用OSS或ALSA。方案一:采用OSS音頻接口來實現(xiàn)。OSS可移植性好,但具有聲卡獨占問題,不支持混音。兩個基于OSS的應用程序不能同時驅動聲卡,也就沒法同時發(fā)出聲音。方案二:采用ALSA音頻接口來實現(xiàn)。ALSA具有聲卡共享的特性,支持混音,兼容OSS接口。兩個基于ALSA的不同應用程序能同時驅動聲卡,就是說能同時發(fā)出聲音。ALSA是一個完全開放源代碼的音頻驅動程序集,除了像OSS那樣提供了一組內(nèi)核驅動程序模塊之外,ALSA還專門為簡化應用程序的編寫提供了相應的函數(shù)庫,與OSS提供的基于ioctl的原始編程接口相比,ALSA函數(shù)庫使用起來要更加方便一些[6]。利用該函數(shù)庫,開發(fā)人員可以方便快捷的開發(fā)出自己的應用程序,細節(jié)則留給函數(shù)庫內(nèi)部處理。綜合分析,采用方案二作為音頻部分的音頻接口。1.2圖像顯示部分方案一:通過幀緩沖顯示圖像。幀緩沖是Linux系統(tǒng)為顯示設備提供的一個接口,它允許應用程序通過此接口訪問圖形設備,而不需關心底層硬件的差異。幀緩沖把顯示設備描述成緩沖區(qū),往顯示緩沖區(qū)寫入數(shù)據(jù),屏幕上會有相應的顯示。但圖像的大小不能隨意修改。方案二:通過gtk顯示圖像。可以自由指定圖像的大小,將攝像頭輸出的rgb數(shù)據(jù)通過函數(shù)gtk_draw_rgb_image();加載到繪圖區(qū),可以指定繪圖區(qū)的大小,從而改變圖像的大小。綜合分析,采用方案二來顯示圖像。2.系統(tǒng)的總體設計能夠錄音并存儲為音頻文件。(2)播放已經(jīng)存在的音頻文件。(3)視頻采集與顯示,能夠實時從攝像頭中 獲取圖像并將攝像頭獲得的幀數(shù)據(jù)顯示到屏幕上。(4)視頻采集與顯示,能夠實時從攝像頭中獲取圖像并將攝像頭獲得的幀數(shù)據(jù)顯示到屏幕上。(5)拍照,保存為bmp照片。(6)圖片瀏覽,能夠顯示存儲的bmp圖片。(7)錄像,存儲攝像頭獲得的數(shù)據(jù),保存為視頻。(8)播放錄像,能夠將存儲的視頻播放出來。3.系統(tǒng)的硬件設計3.1cortexA8實驗儀概述該實驗儀是凌陽教育繼S3c2440之后的又一力作,是一個標準的嵌入式開發(fā)平臺。處理器采用業(yè)界領先的cortexA8,其內(nèi)部集成了豐富的模塊,另外該芯片主頻高達833MHZ,您可以輕松上手linux、wince、android等操作系統(tǒng)的設計及開發(fā)。本開發(fā)板基于開發(fā)考慮,外設齊全,接口標準,擴展方便。整個開發(fā)板采用核心板加底板方法設計,核心板采用八層板設計,線路可靠穩(wěn)定,是嵌入式學習和研究的最佳選擇,該實驗儀適合研究人員和電子愛好者用做評估與開發(fā)。核心板主要元件:CPU型號為S5PV210。DDR2內(nèi)存,一共4片,型號為K4T1G164Q。NANDFLASH,1G版本核心板為K9K8G08,256M版本核心板為K9F2G08。有線網(wǎng)絡芯片,10/100Mbps,SMSCLAN9220。AC97音頻編解碼芯片,WM9713,該芯片包含電阻式觸摸屏控制器。電源轉換芯片,為核心板器件提供所需要的各種電壓轉換。底板主要元器件:電源接口,輸入電壓為5V。電源上串聯(lián)有一個1.1A的自恢復保險絲。電源開關,選用進口優(yōu)質電源開關,可反復開關不低于10萬次。USB2.0OTG接口,采用miniUSB插座,支持480Mbps高速模式。HDMI高清顯示輸出,標準的TypeA型HDMI插座,機械強度高。CVBS視頻輸出端口,用于連接電視機。100M有線以太網(wǎng)接口[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連接到開發(fā)板J17插座[16]。開發(fā)板上DB9插座:圖5串口實物圖圖6串口電路圖圖7串口管腳定義開發(fā)板的DB9串口信號定義和PC的串口定義完全一樣:2:RXD 接收信號,對于開發(fā)板來說是輸入信號3:TXD 發(fā)送信號,對于開發(fā)板來說是輸出信號5:GND 公共地3.4攝像頭參數(shù):高品質CMOS感應器。支持WindowsXPSP2/Vista等操作系統(tǒng)。支持手動式調(diào)焦。靜態(tài)圖像拍照:默認分辨率為640x480。視頻錄像捕捉:默認分辨率為640x480,軟件增值可達到500萬(2560x1920),YUY2輸出格式。USB2.0高速傳輸,高幀速(30-15fps)視頻播放,畫面流暢不停頓。自動白平衡、曝光。最小靈敏度:2.0V/Lux.Sec。閃爍控制:50Hz或60Hz自動識別。支持抓取、儲存靜態(tài)照片(JPG格式)功能。支持QQ、MSN、雅虎通等視頻聊天軟件,等視頻聊天室。工作溫度:-10~60℃。功耗:<0.5W。圖8攝像頭實物圖3.5音頻輸出接口和麥克風音頻輸出端口(J11)為標準3.5mm立體聲耳機插座,接到AC97編解碼芯片WM9713的音頻輸出。麥克風(MIC1)也是接到WM9713。圖9編解碼芯W(wǎng)M9713電路圖當耳機插入耳機插座時候,耳機插頭的金屬部分會把耳機插座的第3腳和第4腳短接。第3腳是地線,這樣相當于把第4腳接地,而第4腳和喇叭的功放使能引腳相連接,第4腳接地時候為低電平,喇叭功放就停止工作。也就是說,耳機插入插座會自動禁止喇叭的聲音[14]。3.6液晶屏輸出接口液晶屏輸出接口(J9)用于連接各種液晶屏,包含了液晶屏數(shù)據(jù)信號,背光電源和觸摸屏這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并聯(lián),R=R27*R26/(R27+R26)=1R,背光電流I=0.1/R=0.1/1=0.1A=100mA[10]。圖11液晶屏電路圖4系統(tǒng)的軟件設計4.1軟件開發(fā)平臺4.1.1sourceinsightSourceInsight是一個面向項目開發(fā)的程序編輯器和代碼瀏覽器,它擁有內(nèi)置的對C/C++,C#和Java等程序的分析。SourceInsight能分析你的源代碼并在你工作的同時動態(tài)維護它自己的符號數(shù)據(jù)庫,并自動為你顯示有用的上下文信息。SourceInsight不僅僅是一個強大的程序編輯器,它還能顯示referencetrees,classinheritancediagrams和calltrees。SourceInsight提供了最快速的對源代碼的導航和任何程序編輯器的源信息。SourceInsight提供了快速和革新的訪問源代碼和源信息的能力。與眾多其它編輯器產(chǎn)品不同,SourceInsight能在你編輯的同時分析你的源代碼,為你提供實用的信息并立即進行分析。SourceInsight是如今最好用的語言編輯器,支持幾乎所有的語言,如C、C++、ASM、PAS、ASP、HTML等常見的,還支持自己定義關鍵字,如果您是一個程序員或者網(wǎng)頁制作人,這個軟件對您都是有幫助的!SourceInsight為您提供了可快速訪問源代碼和源信息的功能。SourceInsight相較其它的編輯器產(chǎn)品來說,還可以幫您分析源代碼,并在您編輯的同時立刻提供給您有用的信息和分析。SourceInsight自動創(chuàng)建并維護它自己高性能的符號數(shù)據(jù)庫,包括函數(shù)、method、全局變量、結構、類和工程源文件里定義的其它類型的符號。SourceInsight可以迅速地更新您的文件信息,即使在您編輯代碼的時候。而且符號數(shù)據(jù)庫的符號可以自動創(chuàng)建倒您的工程文件中。4.1.2gladeGlade是GTK+圖形用戶界面產(chǎn)生器。也就是說,Glade是個VisualProgrammingTool,和MicrosoftWindows平臺的VisualTools類似,只要用鼠標拉一拉,它就會自動幫你產(chǎn)生Csourcecode。所以我們這些懶人,就不用再去為畫面的設計煩惱,用Glade設計好畫面,再用編輯器把程式碼稍為修減就OK了。(現(xiàn)在也有各種語言如C++、Ada95、Python、Perl等的GTK+介面,如果搭配其它工具,也可以自動產(chǎn)生C++,Ada95,PythonandPerl的程式碼)。4.2軟件設計概述在此次設計中,音視頻數(shù)據(jù)采集系統(tǒng)的軟件全部采用c語言編寫。采用模塊化的思想,將程序劃分為多個模塊,便于設計、調(diào)試。此次設計中程序的編寫環(huán)境是ubuntu操作系統(tǒng)。4.3系統(tǒng)主程序創(chuàng)建主界面及各個子界面,在主窗上添加視頻按鈕、音頻按鈕。實現(xiàn)界面間的切換,通過回調(diào)函數(shù)實現(xiàn)各個界面間的切換。創(chuàng)建主窗口顯示背景創(chuàng)建主窗口顯示背景創(chuàng)建拍照錄像窗口創(chuàng)建錄音放音窗口圖片瀏覽窗口視頻播放窗口開始圖12主程序流程圖4.4系統(tǒng)子程序4.4.1錄音子程序在錄音界面,增加錄音按鈕、播放按鈕、返回按鈕。當點擊錄音按鈕時,開始錄音,再次點擊錄音按鈕停止,錄音通過創(chuàng)建線程來實現(xiàn)。實現(xiàn)放音(可以單獨去做界面),點擊放音按鈕或者直接點擊列表中的聲音文件名實現(xiàn)放音。返回按鈕可以返回主界面。初始化音頻設備/dev/dsp初始化錄音窗口初始化音頻設備/dev/dsp初始化錄音窗口打開音頻數(shù)據(jù)文件開線程,從設備中讀取數(shù)據(jù),并寫入文件保存音頻文件開線程,從文件中讀取數(shù)據(jù),寫入設備中關閉音頻文件4.4.2拍照/錄像子程序在錄像界面,當進入錄像窗口時即可初始化v4l2攝像頭設備。增加拍照按鈕,錄制視頻按鈕,圖片/視頻瀏覽按鈕,返回按鈕,以及圖像顯示“窗口”。獲取攝像頭數(shù)據(jù)在開發(fā)板屏幕顯示(創(chuàng)建線程函數(shù)去操作),通過GTK在屏幕實時顯示需要刷新繪圖區(qū)域,通過gtk_widget_queue_draw()就會自動調(diào)用曝光事件所連接的回調(diào)函數(shù),回調(diào)函數(shù)中刷新屏幕從而實現(xiàn)實時顯示。GTK中的繪圖函數(shù)只能夠顯示rgb格式的數(shù)據(jù)。需要將攝像頭yuv數(shù)據(jù)轉化成rgb數(shù)據(jù)[11]。實現(xiàn)拍照功能,點擊拍照按鈕,截取當前攝像頭數(shù)據(jù)保存到圖片中。圖片格式轉換函數(shù):voidrgb24_to_bmp(unsignedchar*rgb24,char*bmp_name,intwidth,intheight);錄像功能實現(xiàn),點擊錄像按鈕時創(chuàng)建線程,獲取圖像并寫入視頻文件。由于rgb數(shù)據(jù)是原始數(shù)據(jù)未壓縮,直接存儲rgb數(shù)據(jù)會導致視頻文件很大,所以需要將rgb數(shù)據(jù)壓縮,即將rgb格式的數(shù)據(jù)轉化為jpg格式的數(shù)據(jù)進行存儲。播放視頻,添加線程,當點擊播放按鈕時,能夠讀取視頻文件中的圖像,并在窗口上顯示(讀出的數(shù)據(jù)為jpg格式,所以要將數(shù)據(jù)在轉化為rgb格式。當退出拍照錄像窗口時,撤銷線程,關閉設備。圖片瀏覽窗口類似。拍照、錄像窗口拍照、錄像窗口選擇拍照or錄像創(chuàng)建線程:不斷從攝像頭中獲取圖像。創(chuàng)建線程:不斷觸發(fā)曝光事件顯示圖像。錄像,開線程將幀數(shù)據(jù)寫文件write_file初始化v4l2拍照保存圖片rgb24_to_bmprgb24_to_bmp關閉文件圖14拍照/錄像子程序流程圖5設計創(chuàng)新5.1創(chuàng)新之一在音視頻設計中,對窗體的設計加入了某些屬性,如單雙擊,滑動窗體等,利用這些屬性結合某些模塊如,時間的控制和調(diào)整,可以替換掉按鈕的單調(diào)操作,也使得界面變得簡潔優(yōu)雅。在利用窗體的單雙擊和滑動事件時要注意對窗體區(qū)域的劃分,對不同的模塊進行控制。5.2創(chuàng)新之二利用時間的值來控制背景圖片的切換,例如每分鐘有六十秒,如果讓秒對29(也可以是其他值)取余,則每分鐘會取到兩次零值,這樣就會觸發(fā)兩次事件來切換圖片,也可以利用分鐘的值,從而達到更長時間的切圖效果。結論該音視頻數(shù)據(jù)采集系統(tǒng)的設計,通過話筒和攝像頭分別對聲音和圖像進行采集,經(jīng)過開發(fā)板的處理,用喇叭播放聲音,用液晶屏顯圖像。在此次設計中,通過理論課的實踐和研討,取得了初步成果,完成了話筒和攝像頭采集數(shù)據(jù),喇叭和液晶屏顯示數(shù)據(jù)的過程。實踐中,錄制視頻和播放視頻是最難的部分,要把圖片按一定的格式存儲到文件里實現(xiàn)錄制視頻,把文件里的圖片取出來通過液晶屏顯示實現(xiàn)播放視頻。參考文獻[1]張綺文等.ARM嵌入式常用模塊與綜合系統(tǒng)設計實例精講[M].北京:電子工業(yè)出版社, 2007.[2]張瑜,王益涵.ARM嵌入式程序設計[M].北京:北京航空航天大學出版社,2009.[3]杜春雷.ARM體系結構與編程[M].北京:清華大學出版社,2003.[4]潘巨龍,黃寧,姚伏天等.ARM9嵌入式Linux系統(tǒng)構建與應用[M].北京:北京航空航天大學 出版社,2006.[5]李新峰,何廣生,趙秀文.基于ARM9的嵌入式Linux開發(fā)技術[M].北京:電子工業(yè)出版 社,2008.[6](美)W.RichardStevensBillFennerAndrewM.Rudoff.UNIX網(wǎng)絡編程第3版[M].北京: 人民郵電出版社,2009.[7]ManufacturingEngineeringLaboratoryNationalInstituteofStandardsand TechnologyGaithersburg[M].U.S.A,2004.[8]尹柱霞,鄭喜鳳,于洪濤.ARM+FPGA控制的LED脫機屏系統(tǒng)設計[J].液晶與顯示. 2010,21,5:23-25.[9]梁廷魁.RS485串行通訊在自動生產(chǎn)線上的應用[J].數(shù)字技術與應用.2011,15,6:45-47.[10]蘇哲欣,劉鴻飛,薛曉.基于嵌入式Linux的LCD驅動分析與實現(xiàn)[J].工業(yè)控制計算機. 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語言教程,北京:電子工業(yè)出版社.附錄A.主函數(shù)初始化全部窗口#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(); //主事件循環(huán) gdk_threads_leave(); return0;}初始化主界面和定義函數(shù)#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;//時間處理參數(shù)gbooleantime_pthread_flag=FALSE;intntm_hour=10;intntm_min=8;intntm_sec=0;/********************************************************************功能: 主窗口顯示可以選擇錄像、音樂、視頻、照片*參數(shù): 無*返回值: 主窗口指針********************************************************************/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;}/***********************************************************************功能: 單雙擊窗體事件*參數(shù): 無*返回值: 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;}/********************************************************************功能: 按鈕信號連接函數(shù)*參數(shù): 無*返回值: 無*********************************************************************/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)) { //時的分區(qū) 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)) { //分的分區(qū) 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)) { //秒的分區(qū) 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(); //進入多線程互斥區(qū)域 gtk_label_set_text((GtkLabel*)(mainbutton.time_label),buff); gdk_threads_leave();}/*********************************************************************功能: 線程函數(shù)顯示時間*參數(shù): 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(); //進入多線程互斥區(qū)域 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;//照片相關參數(shù)intbmp_total=0;intcurrent_bmp_num=0;char*bmp_name[100];charcurrent_bmp[100]="";staticgints_timer=-1;gbooleanauto_play_flag=FALSE;/*********************************************************************功能: 進入圖片瀏覽并創(chuàng)建此界面*參數(shù): 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);}/**********************************************************************功能: 設置圖片瀏覽窗口*參數(shù): 無*返回值: 返回被設置的窗口*********************************************************************/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;}/********************************************************************功能: 按鈕信號連接函數(shù)*參數(shù): 無*返回值: 無********************************************************************/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);}/*********************************************************************功能:自動 播放圖片*參數(shù): 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); }}/*********************************************************************功能: 手動播放圖片回調(diào)函數(shù)*參數(shù): 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);}/*********************************************************************功能: 自動播放圖片*參數(shù): data:播放圖片的畫圖區(qū)域*返回值: 無********************************************************************/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;}/*********************************************************************功能:圖片播放返回窗口*參數(shù):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;}/*********************************************************************功能:圖片刪除*參數(shù):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;/*********************************************************************功能:播放視頻按鈕回調(diào)函數(shù)*參數(shù): 無*返回值: 無********************************************************************/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); }/*********************************************************************功能:讀取文件夾中的視頻文件*參數(shù): 無*返回值: 無********************************************************************/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;}/*********************************************************************功能: 播放視頻線程*參數(shù): 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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 中國商旅管理行業(yè)市場發(fā)展現(xiàn)狀及投資方向研究報告
- 2025年電子廠安全生產(chǎn)提升計劃
- 幼兒園戶外活動安排案例研究
- 輸電六防課件
- 教育機構預算使用監(jiān)督措施
- 交通運輸行業(yè)智能船舶導航與安全管理方案
- 美容美發(fā)連鎖店會員管理與營銷策略研究方案
- 時間管理學習
- 成人教育教學方法探索心得體會
- 房地產(chǎn)開發(fā)電梯維保服務規(guī)劃措施
- 2025年武漢鐵路橋梁職業(yè)學院單招綜合素質考試題庫必考題
- 2025年第六屆(中小學組)國家版圖知識競賽測試題庫及答案
- T∕ZZB 2708-2022 化妝品包裝用玻璃瓶
- 康復治療技術士知識點
- 不隨行父母同意函(父母雙方不隨行)
- 案例——溫泉度假村ppt課件
- 公路工程技術交底大全內(nèi)容
- SLT804-2020 淤地壩技術規(guī)范_(高清-有效)
- 中醫(yī)診所備案信息表
- 網(wǎng)格本模板(A4) (2)
- 固定資產(chǎn)考試試題(共30頁).doc
評論
0/150
提交評論