• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

      基于USB攝像頭的嵌入式視頻監(jiān)控系統(tǒng)

      2012-04-29 22:16:26李健
      電腦知識與技術(shù) 2012年22期
      關(guān)鍵詞:視頻監(jiān)控嵌入式系統(tǒng)

      李健

      摘要:在嵌入式環(huán)境下設(shè)計(jì)開發(fā)了一套基于USB攝像頭的視頻監(jiān)控系統(tǒng)。系統(tǒng)通過V4L接口從USB攝像頭采集圖像,借助QT圖形庫實(shí)現(xiàn)視頻播放;通過OSS接口實(shí)現(xiàn)音頻數(shù)據(jù)的采集與播放;同時能將音視頻信息錄制成通用的AVI格式文件保存到U盤中。實(shí)驗(yàn)表明系統(tǒng)的設(shè)計(jì)方案和實(shí)現(xiàn)技術(shù)是可行的。

      關(guān)鍵詞:嵌入式系統(tǒng);視頻監(jiān)控;USB攝像頭;V4L接口

      中圖分類號:TP391文獻(xiàn)標(biāo)識碼:A文章編號:1009-3044(2012)22-5459-04

      Embedded Video Monitoring System Based on USB Camera

      LI Jian

      (Teaching and Research Section of Computer, The PLA Foreign Language University, Louyang 471003, China)

      Abstract: A video monitoring system was designed and developed based on USB camera in embedded environment. In the system, pictures are captured from USB camera through V4L API and displayed on LCD by QT; Sound data is captured and played through OSS API; in addition, video and sound data can be record on USB disk as AVI files. Experiment shows that the design and implement teleology of the system are feasible.

      Key words: embedded system; video monitoring; USB camera; Video for Linux API

      傳統(tǒng)的以PC機(jī)為處理核心的視頻監(jiān)控技術(shù)已經(jīng)十分成熟,但隨著后PC時代的到來,使用嵌入式系統(tǒng)現(xiàn)實(shí)視頻監(jiān)控將是未來的發(fā)展趨勢。從某種意義上講使用通用的PC機(jī)來完成專用功能是對資源的一種浪費(fèi)。雖然嵌入式系統(tǒng)的資源相對有限,但其所有資源都能被充分利用,同樣能夠很好地實(shí)現(xiàn)某種專用功能。因此使用嵌入式系統(tǒng)取代PC機(jī)進(jìn)行視頻監(jiān)控就意味著用更少的資源提供更好的功能。本文將介紹一個嵌入式視頻監(jiān)控系統(tǒng)的設(shè)計(jì)開發(fā)過程。

      1系統(tǒng)總體設(shè)計(jì)

      1.1系統(tǒng)總體架構(gòu)

      系統(tǒng)建立以S3C2410核心板為中心的硬件平臺,內(nèi)置CPU、RAM和Flash[1],外接LCD顯示器、USB攝像頭等外圍設(shè)備;移植嵌入式Linux操作系統(tǒng)到硬件平臺并安裝QT圖形庫和必要的驅(qū)動程序,為系統(tǒng)運(yùn)行提供軟件環(huán)境。系統(tǒng)的總體架構(gòu)如圖1所示,其中清晰地展示了數(shù)據(jù)的加工流程。

      圖1系統(tǒng)總體架構(gòu)

      系統(tǒng)所選用的USB攝像頭基于ZC301芯片,該攝像頭采用片內(nèi)JPEG壓縮技術(shù);設(shè)備驅(qū)動后通過V4L(Video for Linux)接口對其操作,可以直接從攝像頭讀取JPEG格式的數(shù)據(jù)[2]。通過開發(fā)QT用戶圖形界面來完成JPEG圖像的顯示。音頻接口選用UDA1341芯片,可外接話筒和揚(yáng)聲器;設(shè)備驅(qū)動后通過OSS(Open Sound System)編程接口對其進(jìn)行操作,可以從UDA1341芯片讀取或?qū)懭隤CM編碼數(shù)據(jù)[3]。文件錄制模塊把音視頻信息錄制為通用的AVI文件并存儲在外接U盤中。

      1.2系統(tǒng)總體流程

      為了提高系統(tǒng)的運(yùn)行效率,設(shè)計(jì)了兩個線程來實(shí)現(xiàn)此模塊的功能:一個為音視頻采集線程,一個為播放/錄制線程。采集線程啟動后首先打開音視頻設(shè)備,設(shè)置相關(guān)參數(shù)后不斷采集音視頻信息寫入共享緩沖區(qū);播放/錄制線程在完成相關(guān)設(shè)備初始化后進(jìn)入循環(huán),根據(jù)需要從共享緩沖區(qū)讀取音視頻信息進(jìn)行播放或錄制。兩個線程通過Linux提供的線程函數(shù)實(shí)現(xiàn)對音視頻緩沖區(qū)的互斥訪問,其協(xié)作流程如圖2所示。

      圖2系統(tǒng)總體流程

      2音視頻采集

      2.1視頻采集

      V4L是開源社區(qū)的領(lǐng)袖人物Alan Cox為Linux設(shè)計(jì)的一套規(guī)范,其目的是為Linux下的視頻設(shè)備驅(qū)動的編寫提供統(tǒng)一的接口[20]。V4L的主要接口函數(shù)包括:open()、read()、write()、close()和ioctl(),分別用于打開、讀取、寫入、關(guān)閉和控制視頻設(shè)備。其中ioctl()接口能夠?qū)崿F(xiàn)對攝像頭的多種控制,通過控制參數(shù)來區(qū)分,表1列出了一些常用的控制常量。

      表1 ioctl()中使用的部分控制常量

      ZC301芯片采用片內(nèi)JPEG壓縮技術(shù),即利用V4L編程接口采集出的數(shù)據(jù)是就壓縮后的JPEG文件,能夠拍攝最大分辨率640×480的照片(本系統(tǒng)采用320×240的分辨率)。為了方便對視頻設(shè)備的操作,程序中專門定義了一個名為V4LDevice的結(jié)構(gòu)體,同時定義一個全局變量vd。結(jié)構(gòu)體的定義如下:

      struct V4LDevice

      {int fd;//視頻設(shè)備描述符

      struct video_capability capability; //獲取設(shè)備的基本信息

      struct video_picture picture; //設(shè)置圖像屬性

      struct video_window window; //設(shè)置捕捉區(qū)域

      unsigned char pic_buffer[BUFFER_SIZE];//視頻緩沖區(qū)

      int pic_size;//當(dāng)前圖像實(shí)際大小

      pthread_mutex_t lock; //視頻緩沖區(qū)的互斥鎖

      }vd;

      V4L編程的一般過程為:打開視頻設(shè)備、讀取當(dāng)前參數(shù)、設(shè)置相關(guān)參數(shù)、讀取或循環(huán)讀取視頻數(shù)據(jù)、對視頻數(shù)據(jù)進(jìn)行相關(guān)處理、關(guān)閉視頻設(shè)備。按照對視頻設(shè)備的操作順序,首先打開視頻設(shè)備并完成相關(guān)設(shè)置,下面給出主要代碼:

      vd.fd = open ("/dev/video0", O_RDWR); //以讀寫方式打開設(shè)備結(jié)點(diǎn)i

      octl (vd.fd, VIDIOCGCAP, &vd.capability); //讀取設(shè)備的基本信息

      vd.picture.depth = 8;//圖片色彩深度

      vd.picture.palette = 21;//圖片樣式,21表示JPEG

      vd.picture.colour = 32768;//取一個適中值

      ioctl (vd.fd, VIDIOCSPICT, &vd.picture);//設(shè)置圖片信息

      vd.window.height = 240;//圖像高度

      vd.window.width = 320;//圖像寬度

      ioctl (vd.fd, VIDIOCSWIN, &vd.window);//設(shè)置圖像大小

      pthread_mutex_init (&vd.lock, NULL);//初始化互斥鎖

      vd.pic_size = 0;//當(dāng)前圖像實(shí)際大小

      在上述代碼中分別通過控制常量VIDIOCSPICT和VIDIOCSWIN完成圖片樣式和大小的設(shè)置。攝像頭設(shè)置完成后線程就會不斷循環(huán)采集圖像到緩沖區(qū),下面給出循環(huán)體中采集圖像的相關(guān)代碼:

      char buffer[BUFFER_SIZE];//定義一個局部緩沖區(qū)

      int size = read (vd.fd, buffer, BUFFER_SIZE);//讀取JPEG數(shù)據(jù)f

      or(j=2; j <= size; j++)//獲取當(dāng)前圖像數(shù)據(jù)長度

      { if(*(buffer + j - 2) == 0xFF && *( buffer + j - 1) == 0xD9)

      break;

      }

      if (pthread_mutex_trylock(&vd.lock) == 0)//對全局緩沖區(qū)加鎖

      { vd.pic_size = j;//更新當(dāng)前圖像數(shù)據(jù)長度

      memcpy (vd.pic_buffer, buffer, BUFFER_SIZE);//更新當(dāng)前圖像數(shù)據(jù)

      pthread_mutex_unlock (&vd.lock);//對緩沖區(qū)解鎖

      }

      攝像頭每次采集的圖像數(shù)據(jù)大小不盡相同,但根據(jù)JPEG的文件結(jié)束標(biāo)志為“0xFFD9”可以獲得圖像數(shù)據(jù)的實(shí)際大小。采集完成后需要將視頻數(shù)據(jù)互斥地寫入全局緩沖區(qū),這里用到多線程函數(shù)pthread_mutex_trylock()和pthread_mutex_unlock()完成對緩沖區(qū)的加鎖和解鎖。

      2.2音頻采集的實(shí)現(xiàn)

      OSS(Open Sound System)是最早出現(xiàn)在Linux上的音頻編程接口,它由一套完整的內(nèi)核驅(qū)動程序模塊組成,可以為絕大多數(shù)聲卡提供統(tǒng)一的編程接口[21]。Mixer(混音器)和DSP(數(shù)據(jù)信號處理器)為OSS標(biāo)準(zhǔn)中的兩個基本音頻設(shè)備。Mixer設(shè)備的驅(qū)動接口相對簡單,除了open()和release()外,主要使用ioctl()方法實(shí)現(xiàn)對輸入/輸出音量的控制。DSP設(shè)備所提供的驅(qū)動接口主要有open()、ioctl()、read()、write()、close()、release()。

      與視頻采集類似,程序中定義了名為DspDevice的結(jié)構(gòu)體用于音頻設(shè)備操作,同時定義全局變量dd。該結(jié)構(gòu)體中除了包括設(shè)備的文件描述符、設(shè)備相關(guān)參數(shù)、音頻緩沖區(qū)等信息外,還定義了一個變量flag_display用于標(biāo)記當(dāng)前音頻數(shù)據(jù)是否被播放過。由于音頻的一幀表示一個時段,如果出現(xiàn)播放重復(fù)則會嚴(yán)重影響聲音的質(zhì)量,而通過標(biāo)記flag_display可以避免這種情況。兼顧聲音質(zhì)量和節(jié)省存儲空間,我們在設(shè)備初始化時將量化位數(shù)設(shè)為8位,聲道類型選擇雙聲道,采樣速率設(shè)為8000Hz。音頻采集的方式與視頻類似,下面列出循環(huán)體中音頻采集的主要代碼:

      char buffer2[AUDIO_LENGTH];//定義一個局部緩沖區(qū)

      read (dd.fd, buffer, AUDIO_LENGTH));//采集音頻數(shù)據(jù)

      if (pthread_mutex_trylock(&w->dd.lock) == 0)//加鎖

      {memcpy (w->dd.sound_buffer, buffer, AUDIO_LENGTH);

      dd. flag_display=1;//播放標(biāo)志(1表示未播放)

      pthread_mutex_unlock (&w->dd.lock); //解鎖

      }

      3音視頻播放

      3.1視頻播放的實(shí)現(xiàn)

      Qt是一個跨平臺的C++圖形用戶界面應(yīng)用程序框架,起初由挪威TrollTech公司開發(fā),后來由諾基亞公司收購。QT類似于Windows平臺下的MFC或ATL等,可用于實(shí)現(xiàn)圖形界面、網(wǎng)絡(luò)通信、線程控制、文件操作等等[4]。

      視頻播放本質(zhì)上就是要將圖像顯示在服務(wù)器端的LCD上,這需要借助QT的圖形界面來完成。由于Qt的最新版本對硬件條件要求較高,本系統(tǒng)選用Qt的早期版本2.3進(jìn)行圖形界面的開發(fā)。攝像頭采集是JPEG格式的圖像,而本系統(tǒng)所選用的Qt版本并不直接支持JPEG格式圖像,所以首先要安裝JPEG庫使QT支持JPEG格式[5]。具體繪制圖像的功能是通過QT中的QPixel和QPainer類來完成,下面給出繪制圖像的關(guān)鍵代碼:

      QPainter painter (w);//定義一個QPainter對象

      painter.setClipRect (w->rect ());//設(shè)置painter的繪制區(qū)域

      QPixmap pixmap;//定義一個QPixmap對象

      pthread_mutex_lock (&vd.lock);//對視頻緩沖區(qū)加鎖

      struct packet_head *head = (struct packet_head *) w->vd.pic_buffer;

      int jpeg_size = head->data_size;//獲取圖像大小

      unsigned char *jpeg_data = vd.pic_buffer+head->head_size;//獲取數(shù)據(jù)指針

      if(pixmap.loadFromData (jpeg_data, jpeg_size, "JPEG", QPixmap::Auto))

      {painter.drawPixmap(10, 55, pixmap);//繪制圖像

      }pthread_mutex_unlock(&vd.lock);//對視頻緩沖區(qū)解鎖

      3.2音頻播放的實(shí)現(xiàn)

      由于系統(tǒng)所選用的UDA1341音頻芯片同時支持音頻的采集與播放,本地音頻播放同樣采用此設(shè)備完成。與音頻采集相對應(yīng),使用寫(write)操作完成音頻播放,而采集則是讀(read)操作。下面給出本地音頻播放的主要代碼:

      pthread_mutex_lock (&w->dd.lock);

      if (dd.flag_display == 1)//如果當(dāng)前音頻數(shù)據(jù)是否播放過

      {write (w->dd.fd, w->dd.sound_buffer, AUDIO_LENGTH);

      dd.flag_display = 0;//將當(dāng)前數(shù)據(jù)設(shè)為已播放

      }pthread_mutex_unlock (&w->dd.lock);

      在上述代碼中對flag_display的判斷是為了避免對同一音頻數(shù)據(jù)進(jìn)行重復(fù)播放,播放完成當(dāng)前數(shù)據(jù)后,應(yīng)將其狀態(tài)設(shè)為已播放。

      4 AVI文件的錄制

      AVI(Audio Video Interleaved)是一種將音視頻同步組合的文件格式,它符合RIFF(Resource Interchange File Format)規(guī)范[6]。一個AVI文件通常包含兩個不同類型的媒體流:一個音頻流和一個視頻流,不過含有單一音頻流或單一視頻流的AVI文件也是合法的。由于AVI文件的內(nèi)部結(jié)構(gòu)比較復(fù)雜,這里不再詳述[7]。

      文件錄制與視頻播放在同一個線程內(nèi)完成,當(dāng)用戶選擇錄制功能后,系統(tǒng)則在外接U盤中創(chuàng)建AVI文件,然后不斷從音視頻緩沖區(qū)讀取數(shù)據(jù)寫入文件;為了方便對錄制文件的管理,系統(tǒng)規(guī)定了每個AVI文件的大小為100M,當(dāng)文件超過100M時則新創(chuàng)建一個文件繼續(xù)錄制。

      AVI文件由文件頭、數(shù)據(jù)塊和索引塊三部分組成。文件頭中除了包括編碼類型、圖像大小、聲道類型、采樣率等靜態(tài)信息之外,還包含了的文件長度、播放時間、幀率等動態(tài)信息,這些信息必須在AVI文件錄制完畢后才能全部獲得,雖然它是文件的開始部分卻應(yīng)最后寫入;數(shù)據(jù)塊是AVI的主體部分,包含若干音頻幀和視頻幀,在錄制過程中不斷增加;索引塊是可選的,保存了每一幀數(shù)據(jù)在文件中的位置以加速對文件的讀取,本系統(tǒng)保留了這一域。

      圖3本地錄制的實(shí)現(xiàn)框架

      由于AVI文件錄制的實(shí)現(xiàn)過程比較復(fù)雜,所涉及的代碼較多,整個錄制過程主要由以下四個功能函數(shù)來實(shí)現(xiàn):new_AVI_file()函數(shù)完成創(chuàng)建AVI文件的創(chuàng)建和初始化工作;AVI_write_frame()函數(shù)用來寫入視頻數(shù)據(jù);AVI_write_audio()函數(shù)用來寫入音頻數(shù)據(jù);close_AVI_file()函數(shù)在生成完整的AVI文件后將其關(guān)閉并釋放相關(guān)資源。圖3給出本地錄制在程序中的實(shí)現(xiàn)框架。

      5結(jié)束語

      該系統(tǒng)綜合運(yùn)用多種嵌入式技術(shù),實(shí)現(xiàn)了音視頻采集、音視頻播放和AVI文件錄制等功能,達(dá)到了預(yù)期的設(shè)計(jì)目標(biāo)。系統(tǒng)所涉及的關(guān)系技術(shù)在本文中都進(jìn)行了詳細(xì)介紹,這對相似系統(tǒng)的開發(fā)具有很好的借鑒價值。

      參考文獻(xiàn):

      [1]博創(chuàng)科技.UP-NETARM2410-S(Linux)嵌入式系統(tǒng)實(shí)驗(yàn)指導(dǎo)書[EB/OL].[2008-09-12].http://www.up-tech.com.

      [2] Alan Cox.Video4Linux Programming[EB/OL].alan@redhat.com.2002.

      [3]程虹霞,朱珠,吳小強(qiáng),等.Linux下語音實(shí)時通信的一種實(shí)現(xiàn)方法[J].兵工自動化,2010(3):94-97.

      [4]倪繼利.QT及Linux操作系統(tǒng)窗口設(shè)計(jì)[M].北京:電子工業(yè)出版社,2006.

      [5] Daniel Molkentin.The Book of Qt 4:The Art of Building Qt Applications[M].No Starch Press,2007.

      [6]除殿武.AVI文件格式及其應(yīng)用研究[J].現(xiàn)代電子技術(shù),2008(2):119-122.

      [7]田旭,胡桂琴.AVI文件的分解處理[J].河北工業(yè)科技,2006(4):240-242.

      猜你喜歡
      視頻監(jiān)控嵌入式系統(tǒng)
      基于視頻圖像采集移動目標(biāo)檢測系統(tǒng)的設(shè)計(jì)
      數(shù)字化監(jiān)控系統(tǒng)的企業(yè)應(yīng)用
      廣東地區(qū)輸電線路在線監(jiān)測技術(shù)應(yīng)用探究
      基于嵌入式Linux的視頻監(jiān)控系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
      辦公自動化系統(tǒng)的設(shè)計(jì)
      基于HTML5的視頻監(jiān)控微課設(shè)計(jì)淺析
      嵌入式系統(tǒng)在醫(yī)療器械中的應(yīng)用分析
      基于物聯(lián)網(wǎng)項(xiàng)目驅(qū)動的嵌入式系統(tǒng)教學(xué)改革的研究與實(shí)踐
      嵌入式系統(tǒng)課程“中斷、異常與事件”教學(xué)實(shí)踐及啟示
      面向?qū)嵺`創(chuàng)新人才培養(yǎng)的嵌入式系統(tǒng)教學(xué)研究
      类乌齐县| 高淳县| 静海县| 鄂伦春自治旗| 米脂县| 象山县| 临泉县| 类乌齐县| 奎屯市| 威远县| 武邑县| 安远县| 岗巴县| 和平区| 灵石县| 进贤县| 新宁县| 大姚县| 浙江省| 夏邑县| 溆浦县| 雅江县| 昆明市| 阜康市| 台东市| 科技| 县级市| 晋宁县| 册亨县| 璧山县| 江阴市| 大安市| 交城县| 台东市| 淮北市| 邯郸县| 太白县| 新安县| 额尔古纳市| 昌黎县| 德江县|