基于S3C6410的視頻監(jiān)控系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
3.1 視頻數(shù)據(jù)采集程序
視頻采集程序使用內(nèi)存映射的方式進(jìn)行讀取。通過(guò)內(nèi)存映射直接把設(shè)備文件映射到內(nèi)存中,繞過(guò)內(nèi)核緩沖區(qū),進(jìn)程訪(fǎng)問(wèn)設(shè)備文件時(shí)和訪(fǎng)問(wèn)普通內(nèi)存一樣,極大的提高了視頻數(shù)據(jù)的讀取速度。
視頻采集部分的流程圖如圖3所示。
下面列出視頻采集部分的關(guān)鍵代碼。
首先打開(kāi)設(shè)備,其中CODEC_NODE為預(yù)定義宏,表示攝像頭結(jié)點(diǎn)文件路徑。
dev_fp=open(CODEC_NODE,O_RDWR);
在設(shè)置參數(shù)部分,首先要得到設(shè)備能力參數(shù),檢查是否具有所需的功能,然后再進(jìn)行參數(shù)的設(shè)置。使用下面的代碼來(lái)實(shí)現(xiàn)。
ioctl(dev_fp,VIDIOC_QUERYCAP,&cap);
上一行代碼得到設(shè)備的功能信息,存儲(chǔ)到參數(shù)caF中。在檢查設(shè)備具有所需功能后,下一行代碼進(jìn)行參數(shù)設(shè)置。
ioctl(dev_fp,VIE)IOC_S_FMT,codec_fmt);
其中,codec_fmt為一個(gè)格式信息的結(jié)構(gòu)體類(lèi)型參數(shù)。
在Linux平臺(tái),采集圖像數(shù)據(jù)部分的實(shí)現(xiàn)方式與文件讀取類(lèi)似,采用下面的代碼實(shí)現(xiàn)。
read(dev_fp,g_yuv,YUV_FR_BUF_SIZE);
而將數(shù)據(jù)傳送給MFC模塊這部分,可以采取直接共享緩沖區(qū)的方式,這樣減少了一次數(shù)據(jù)在內(nèi)存中的傳輸,增加了效率。
最后是關(guān)閉設(shè)備文件。先停止圖像的采集,然后關(guān)閉文件。
ioctl(dev_fp,VIDIOC_STREAMOFF,&start);
close(dev_fp);
上述代碼片段是視頻采集部分的關(guān)鍵代碼段。在實(shí)現(xiàn)部分還有很多的條件判斷和分支選擇等控制流程部分,這里不進(jìn)行詳細(xì)描述。
3.2 視頻編碼程序
視頻編碼部分直接采用S3C6410的MFC視頻編解碼模塊進(jìn)行視頻的編碼。由于采用硬件編碼,編碼效率非常高。同時(shí)在程序的設(shè)計(jì)方面,不用涉及具體的硬件細(xì)節(jié),只需要通過(guò)S3C6410提供的驅(qū)動(dòng)模塊進(jìn)行。編碼部分的流程圖如圖4所示。本文引用地址:http://m.butianyuan.cn/article/165899.htm
評(píng)論