基于S3C6410的視頻監(jiān)控系統(tǒng)的設計與實現
下面列出視頻編碼部分的關鍵代碼。
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)是用于網絡多媒體數據流的一種傳輸協議。為了使系統(tǒng)的實現更簡單和穩(wěn)定,采用已有的RTP庫進行程序的開發(fā)。本系統(tǒng)選用開源的C語言庫oRTP進行開發(fā)。
oRTP庫是對RTP協議的一種實現,完全采用C語言編寫。oRTP庫使用簡單易用的接口,實現了RTP協議,可以工作于Linux,Windows等多個
平臺。
系統(tǒng)網絡傳輸模塊的流程比較簡單。模塊首先初始化oRTP庫,然后傳輸數據,在傳輸完成后釋放oRTP庫資源。由于模塊流程較簡單,在此就不列出系統(tǒng)的流程圖,僅針對具體的實現進行說明。下面列出網絡傳輸模塊的關鍵代碼。在傳輸數據之前,要對oRTP庫進行一些基本的初始化操作。首先對時間戳進行初始化,采用下面的一行代碼實現。
m_nUser-Timestamp=0;
然后,調用oRTP庫提供的初始化接口函數:
ortp_init();
ortp_scheduler_init();
在完成基本的初始化后,創(chuàng)建一個新的rtp會話對象,并且設置會話對象的一些參數和屬性。
session=rtp_session_new(RTP_SESSION_SENDONLY);
上面的代碼創(chuàng)建了一個新的rtp會話對象,接下來用下面的函數對session進行參數和屬性的設置。
rtp_session_set_scheduling_mode(); rtp_session_set_blocking_mode(); rtp_session_set_remote_addr();rtp_session_set _payload_type();
上面的函數依次對rtp會話對象的調度管理、阻塞模式、發(fā)送目的地址和負載類型進行設置。限于篇幅,略去了調用參數。
發(fā)送數據調用庫函數:
rtp_session_send_wlth_ts();
在發(fā)送數據完成后,銷毀rtp會話對象,然后釋放oRTP庫的資源。
rtp_session_destroy(session);
ortp_exit();
在網絡傳輸模塊中需要注意的是,由于RTP協議對數據包的大小是有限制的,所以如果傳輸的視頻幀過大,需要進行分包傳輸處理。
4 結語
本文在基于S3C6410微處理器的開發(fā)平臺上,實現了一種基于MPEG-4編碼的視頻監(jiān)控系統(tǒng)。利用S3C6410內部集成的MFC模塊進行視頻編碼,實現了很高的編碼效率。最后,通過RTP協議進行網絡數據傳輸。采用模塊化的設計之后,使得系統(tǒng)的網絡數據傳輸部分與具體的有線或者無線傳輸方式無關。文章在描述各部分實現流程的基礎上,詳細地說明了關鍵部分的代碼實現。實驗測試中,數據編碼效率很高。采用了
MPEG-4編碼方式,在正常網絡情況下,傳輸視頻質量較好,系統(tǒng)運行穩(wěn)定。實驗證實了系統(tǒng)的可行性較高。本文引用地址:http://m.butianyuan.cn/article/165899.htm
評論