http://tech.c114.net/166/a669261.html http://www.c114.net ( 2012/2/9 15:32
)
摘要:為了實現一種簡單,可靠性高的嵌入式視頻監控系統,基於三星S3C6410微處理器系統,結合嵌入式技術和影像處理技術,利用S3C6410的硬體編碼模組MFC進行MPEG-4編碼,採用即時傳輸協議通過網路進行視頻傳輸。經區域網路條件下測試,該系統採集傳輸視頻品質較好,效能穩定,滿足低成本、高可靠性的嵌入式視頻監控要求。在描述系統架構的同時,更具體地說明了實現部分的關鍵程式碼範例。
視頻監控的應用領域日益廣泛。隨著電子資訊技術、多媒體技術以及網路技術的快速發展,嵌入式視頻監控技術也得到了快速的發展。相比較傳統的監控系統,嵌入式監控系統具有成本低,小巧靈活,高可靠性等特點。本文以三星S3C6410微處理器為基礎處理器ARM11,實現了一種簡單高效的視頻監控系統。系統既可以使用網線進行傳輸,也可以採用無線USB網卡進行無線傳輸。本文在說明系統架構的同時,著重對系統實現的具體軟體進行了說明。
1 系統的組成和工作原理
嵌入式視頻監控系統由硬體部分和軟體部分組成。硬體部分由視頻採集模組、視頻編碼模組、網路傳輸模組以及嵌入式處理器模組組成;軟體部分基於嵌入式作業系統平台,包括視頻資料擷取模組、視頻編碼模組和網路傳輸模組等。
系統的總體設計原理為:通過OV9653的130萬像素網路攝影機採集視頻資料,然後將視頻資料發送到S3C6410的MFC(多媒體格式編解碼)模組進行視頻編碼後,得到MPEG-4視頻流,最後將資料通過網路模組發送到接收端。系統組成框圖1所示。
2 系統的硬體設計
2.1 資料擷取模組
視頻採集模組採用OV9653網路攝影機感應器。OV9653網路攝影機感應器是低電壓的CMOS映像感應器。採集映像的輸出格式可以是YUV/YCbCr 4:2:2或者RGB
4:2:2。
2.2 視頻編碼模組
系統基於ARMSYS6410開發板開發。ARMSYS6410開發板以三星S3C6410微處理器(ARM1176JZF-S核心)為核心。
利用S3C6410提供的MFC(多媒體格式編解碼)模組進行編碼,將OV9653採集到的YUV格式資料編碼成MPEG-4格式資料流。同時,也可以將OV9653採集的RGB格式的資料直接顯示在LCD屏上。
2.3 網路傳輸模組
基於S3C6410微處理器的ARMSYS6410開發板提供了1路10M/100M網路介面,1路USB2.0-OTG,1路USB Host。在網路傳輸模組中可以直接使用網路介面來進行有線網路資料轉送,也可以使用USB介面的網路卡來進行無線資料轉送。區別只是在軟體部分使用的驅動不同,而對程式的結構沒有任何影響。
2.4 嵌入式處理器模組
三星S3C6410微處理器(ARM1176JZF-S核心)是一款高效能的多媒體應用處理器,具有強大的硬體多媒體格式編解碼單元(MFC),完善的外部裝置,同時擁有高達667MHz的運行頻率。
3 系統的軟體設計
嵌入式作業系統是嵌入式系統的重要組成部分,為應用程式的開發提供了一個軟體平台。由於Linux系統具有良好的可裁剪和可移植等特性,目前較多地採用Linux系統來進行嵌入式系統的開發。
基於S3C6410的ARMSYS6410開發板,已經提供了基於Linux 2.6.28核心的作業系統源碼。通過對核心各個功能模組進行裁剪,編譯出鏡像檔案,然後下載到開發板上,即可實現Linux嵌入式作業系統以及相應的驅動程式的移植。
系統的整體資料流2所示。圖中①表示未經處理資料從外部網路攝影機到網路攝影機驅動模組。②表示資料由驅動模組經過處理傳輸到記憶體。此時資料可以有不同的格式。③表示資料從記憶體中傳送給視頻編碼模組的輸入緩衝區。④表示MFC編碼模組從輸入緩衝區讀取資料進行MPEG-4編碼。⑤表示編碼結束後將資料傳送到視頻編碼模組的輸出緩衝區。⑥表示從視頻編碼的輸出緩衝區讀取編碼後的資料傳送給網路傳輸模組進行傳輸。
在此需要注意的是,圖示中的視頻輸入緩衝區對於解碼模組是輸入緩衝區,但是對於編碼模組卻是輸出緩衝區。對於圖示中的輸出緩衝區也同樣如此。
3.1 視頻資料擷取程式
視頻採集程式使用記憶體映射的方式進行讀取。通過記憶體映射直接把裝置檔案對應到記憶體中,繞過核心緩衝區,進程訪問裝置檔案時和訪問普通記憶體一樣,極大的提高了視頻資料的讀取速度。
視頻採集部分的流程圖3所示。
下面列出視頻採集部分的關鍵代碼。
首先開啟裝置,其中CODEC_NODE為預定義宏,表示網路攝影機結點檔案路徑。
dev_fp=open(CODEC_NODE,O_RDWR);
在設定參數部分,首先要得到裝置能力參數,檢查是否具有所需的功能,然後再進行參數的設定。使用下面的代碼來實現。
ioctl(dev_fp,VIDIOC_QUERYCAP,&cap);
上一行代碼得到裝置的功能資訊,儲存到參數caF中。在檢查裝置具有所需功能後,下一行代碼進行參數設定。
ioctl(dev_fp,VIE)IOC_S_FMT,&codec_fmt);
其中,codec_fmt為一個格式資訊的結構體型別參數。
在Linux平台,採集映像資料部分的實現方式與檔案讀取類似,採用下面的代碼實現。
read(dev_fp,g_yuv,YUV_FR_BUF_SIZE);
而將資料傳送給MFC模組這部分,可以採取直接共用緩衝區的方式,這樣減少了一次資料在記憶體中的傳輸,增加了效率。
最後是關閉裝置檔案。先停止映像的採集,然後關閉檔案。
ioctl(dev_fp,VIDIOC_STREAMOFF,&start);
close(dev_fp);
上述程式碼片段是視頻採集部分的關鍵程式碼片段。在實現部分還有很多的條件判斷和分支選擇等控制流程程部分,這裡不進行詳細描述。
3.2 視頻編碼程式
視頻編碼部分直接採用S3C6410的MFC視頻編解碼模組進行視頻的編碼。由於採用硬體編碼,編碼效率非常高。同時在程式的設計方面,不用涉及具體的硬體細節,只需要通過S3C6410提供的驅動模組進行。編碼部分的流程圖4所示。
下面列出視頻編碼部分的關鍵代碼。
hOpen=open(MFC_DEV_NAME,O_RDWR | O_NDELAY);
上一行代碼開啟MFC裝置。由預定義的宏MFC_DEV_NAME指定MFC裝置檔案路徑。
模組的初始化部分需要指定編碼幀的長寬,編碼幀的速率等參數。初始化的這些資訊並沒有直接應用於裝置,而是儲存於一個編碼參數的結構體型別參數pCTX中,然後用下面的代碼進行參數設定,也即將參數應用於實際的裝置。
ioctl(pCTX->hOpen,cmd_init,&mfc_args);
編碼部分用下一行代碼實現。
ioetl(pCTX->hOpen,cmd_exe,&mfc_args);
在編碼完成後,可以通過函數擷取編碼後視訊框架的記憶體位址。函數原型為:
void*SsbSipMPEG4EncodeGetOutBuf(vold*openHandle,long*size)。
最後關閉裝置檔案。
close(pCTX->hOpen);
同樣,對於一些流程式控制制部分的代碼,限於篇幅,沒有進行詳細的描述。
3.3 網路傳輸程式
網路部分採用RTP即時傳輸協議進行視頻資料的傳輸。RTP(Real-time Transport Protocol)是用於網路多媒體資料流的一種傳輸協議。為了使系統的實現更簡單和穩定,採用已有的RTP庫進行程式的開發。本系統選用開源的C語言庫oRTP進行開發。
oRTP庫是對RTP協議的一種實現,完全採用C語言編寫。oRTP庫使用簡單易用的介面,實現了RTP協議,可以工作於Linux,Windows等多個平台。
系統網路傳輸模組的流程比較簡單。模組首先初始化oRTP庫,然後傳輸資料,在傳輸完成後釋放oRTP庫資源。由於模組流程較簡單,在此就不列出系統的流程圖,僅針對具體的實現進行說明。下面列出網路傳輸模組的關鍵代碼。在傳輸資料之前,要對oRTP庫進行一些基本的初始化操作。首先對時間戳記進行初始化,採用下面的一行代碼實現。
m_nUser-Timestamp=0;
然後,調用oRTP庫提供的初始化介面函數:
ortp_init();
ortp_scheduler_init();
在完成基本的初始化後,建立一個新的rtp會話對象,並且設定會話對象的一些參數和屬性。
session=rtp_session_new(RTP_SESSION_SENDONLY);
上面的代碼建立了一個新的rtp會話對象,接下來用下面的函數對session進行參數和屬性的設定。
rtp_session_set_scheduling_mode(); rtp_session_set_blocking_mode(); rtp_session_set_remote_addr();rtp_session_set _payload_type();
上面的函數依次對rtp會話對象的調度管理、阻塞模式、發送目的地址和負載類型進行設定。限於篇幅,略去了調用參數。
發送資料調用庫函數:
rtp_session_send_wlth_ts();
在發送資料完成後,銷毀rtp會話對象,然後釋放oRTP庫的資源。
rtp_session_destroy(session);
ortp_exit();
在網路傳輸模組中需要注意的是,由於RTP協議對資料包的大小是有限制的,所以如果傳輸的視訊框架過大,需要進行分包傳輸處理。
4 結語
本文在基於S3C6410微處理器的開發平台上,實現了一種基於MPEG-4編碼的視頻監控系統。利用S3C6410內部整合的MFC模組進行視頻編碼,實現了很高的編碼效率。最後,通過RTP協議進行網路資料轉送。採用模組化的設計之後,使得系統的網路資料轉送部分與具體的有線或者無線傳輸方式無關。文章在描述各部分實現流程的基礎上,詳細地說明了關鍵區段的代碼實現。實驗測試中,資料編碼效率很高。採用了MPEG-4編碼方式,在正常網路情況下,傳輸視頻品質較好,系統運行穩定。實驗證實了系統的可行性較高。
作者:胡世敏 來源:現代電子技術
免責聲明:本文僅代表作者個人觀點,與C114中國通訊網無關。其原創性以及文中陳述文字和內容未經本站證實,對本文以及其中全部或者部分內容、文字的真實性、完整性、及時性本站不作任何保證或承諾,請讀者僅作參考,並請自行核實相關內容。