本站小編為你精心準備了無線視頻傳輸系統的設計參考范文,愿這些范文能點燃您思維的火花,激發您的寫作靈感。歡迎深入閱讀并收藏。
《無線通信技術雜志》2014年第二期
1視頻數據的采集和編碼
1.1基于V4L2的視頻數據采集設計V4L2(VideoforLinuxTwo)是V4L的改進版,V4L2改進了V4L中的不足,具有更好的擴展性和靈活性,并且支持的硬件設備更多。利用V4L2接口函數獲取視頻幀數據有3種方式:read、write方式,用戶指針方式,內存映射mmap方式。本系統通過內存映射方式采集,采用這種方法不僅讀取方便,而且省去了大量的內存拷貝,效率較高[8]。視頻采集過程如圖3。(1)打開視頻設備文件。fd=open(Device-name,mode);第一個參數是注冊在/dev/目錄下的設備名,打開模式可分為阻塞和非阻塞模式。(2)獲取設備屬性。調用函數ioctl(fd,VIDIOC_QUERYCAP,&cp)獲取打開設備文件的相關參數并存放到cap結構中。(3)設置視頻的制式和幀格式。調用函數ioctl(fd,VIDIOCS_FMT,&fmt)設置捕獲圖像的存儲格式、寬帶、高度、像素大小等。(4)申請幀緩沖區,并進行內存映射。調用函數ioctl(fd,VIDIOC_REQBUFS,&req)向內核申請req.count個幀緩存。通過VIDIOC_QUERBUF獲取緩存幀在內核空間的地址,通過mmap方式將內核空間中的內存映射到用戶空間。(5)采集視頻數據。調用函數ioctl(fd,VIDIOC_STREAMON,&type)將數據存放到緩存中。(6)處理采集的數據。當應用程序將最先采到的一幀數據取走時,幀緩沖重新放入隊列尾,從而循環采集數據。(7)關閉視頻設備。調用close(fp)實現設備的關閉。
1.2基于MFC的H.264編碼設計本系統利用S3C6410提供的MFC硬件編解碼器實現了H.264標準的視頻壓縮。硬編碼具有不占用CPU資源,運算速度快等優點,從而滿足視頻數據實時性的要求。H.264編碼器要求輸入數據為YUV420格式,而V4L2輸出的視頻數據是YUV422格式,因此在完成編碼工作之前,要利用函數DoConvert()將YUV422格式轉換為YUV420格式。編碼的過程如圖4。(1)創建H.264編碼器。調用函數Ssb-SipH264EncodeInit(width,height,frame_rate,bitrate,gop_num)實現。(2)設置編碼器參數,初始化H.264編碼器,分別調用函數SsbSipH264EncodeSetConfig(handle,type,value)和函數SsbSipH264EncodeExe(handle)來實現。(3)獲取要編碼的視頻數據的輸入緩沖區地址,調用SsbSipH264EncodeGetInBuf(handle,0)來實現,該函數返回視頻數據的輸入地址。(4)讀取要編碼的視頻數據,調用函數memcpy(p_inbuf,in_addr,frame_size)將需要編碼的視頻數據復制到上一步驟的輸入緩沖區中。(5)編碼視頻數據,調用函數Ssb-SipH264EncodeExe(handle)實現H.264編碼。(6)輸出已編碼的視頻數據,調用函數Ssb-SipH264EncodeGetOutBuf(handle,size)獲取編碼后數據的輸出緩沖區和編碼數據大小。(7)關閉設備,調用函數Ssb-SipH264EncodeDeInit(handle)釋放編碼器資源,并且關閉MFC設備。圖4H.264編碼流程圖
2視頻數據的傳輸
2.1基于RTP/RTCP的流媒體實時傳輸設計為滿足視頻監控實時性的要求,需要RTCP(實時傳輸控制協議)和RTP(實時傳輸協議)協同使用,以有效的反饋和最小的開銷使傳輸效果達到最好。RTP負責實時性傳輸,但它本身不提供QoS,需要RTCP提供視頻質量控制的手段和方法。而控制RTP包的發送則通過RTSP協議完成。
2.1.1live555簡介本系統利用開源Live555庫實現了基于RTP、RTCP的實時傳輸。Live555庫是一種為流媒體傳輸提供解決方案的跨平臺C++開源項目,在嵌入式環境中運行穩定,性能較好,支持RTP/RTCP/RTSP/SDP等協議,支持多種音視頻編碼格式(如H.264、MPEG4、JPEG、DV等)的音視頻數據的發送、接收和處理。Live555包含四個基本的庫分別是BasicUsageEnvironment&TaskScheduler、UsageEnvir-onment、GroupSock和LiveMedia。LiveMedia模塊是最重要的模塊,基類是Medium,其它所有類都派生自該類[9]。
2.1.2基于Live555的流媒體服務器的設計針對Live555開源項目不支持H.264實時視頻流的接收,我們繼承FramedSource類寫一個Camer-aH264StreamFramer類,這個類負責實時的采集視頻圖像,使用MFC進行H.264硬編碼,然后覆蓋成員函數doGetNextFrame()。H.264編碼的每一幀交給VideoServerMediaSubsession處理。另外,還需要繼成OnDemandServerMediaSubses-sion類,寫一個H264LiveVideoServerMediaSubsession類,這個類負責管理Source和Sink,指示輸入和輸出。函數createNewStreamSource返回了實例化的CameraH264StreamFramer;函數createNewRTPSink返回了實例化的H264VideoRTPSink,其父類為RTP-Sink,這個類的作用是把原始的H264流封裝成RTP數據包[10-12]。類結構圖如圖5:
2.1.3流媒體主程序設計流媒體主程序步驟如下:(1)構造應用程序環境類:包括任務調度器TaskScheduler,構造UsageEnviRonment對象的時候需要TaskScheduler作參數。(2)構造RTSPServer對象,代表整個流媒體VideoServer,配置監聽端口,這里設置為8554,可以選擇是否使用用戶名密碼方式訪問。(3)構造MediaSession對象和MediaSubsession對象,表示具體的輸入視頻流和輸出流。MediaSub-session就是我們構造的H264LiveVideoServerMediaSubsession。(4)把MediaSession加入到RTSPServer,調用RTSPServer的doEventLoop進入消息循環,開始監聽用戶請求接入,處理消息請求。圖5類結構圖圖6視頻監控效果圖
2.23G模塊聯網3G模塊與ARM是通過USB相連的。3G網絡的連接是通過點對點(PPP)協議來完成的,PPP是在串行連接的數據鏈路實現IP以及其它網絡協議的一種機制[13]。在Linux內核中已經添加了3G模塊的驅動和PPP協議的支持,還需要移植相應的撥號軟件實現撥號上網。本文選擇撥號軟件pppd,下載ppp-2.
2.4源碼包,進行交叉編譯生成撥號所需的應用程序pppd和chat,將這兩個應用程序拷貝到開發板/usr/sbin文件夾下,更改其屬性為可執行文件。配置好撥號的腳本文件后,通過pppdcall命令即可實現WCDMA無線網絡的接入。通過AT指令對視頻數據進行UDP打包,最終將視頻數據包發送到3G網絡上。
3終端設備
在Window平臺下,用VLC播放器可以接收傳輸過來的視頻流。如果終端設備IP:221.6.52.114,在VLC的地址欄輸入rtsp://221.6.52.114:8554/live就可以播放流媒體視頻。運行效果如圖6。
4結束語
經測試,本系統采集分辨率為320*240的圖像,經H.264硬編碼后,每幀圖像大小只有5KB左右,幀率可達25f/s。對于WCDMA無線網絡的傳輸率一般在2Mbit/s左右,因此,該無線網絡能夠滿足實時視頻傳輸的需求。本文設計的視頻傳輸系統結合了嵌入式技術﹑視頻壓縮編碼技術﹑流媒體實時傳輸技術、無線通信技術等多項技術,系統具有實時性好、穩定性高、低成本、低功耗等優點,有很高的應用價值和較為廣闊的市場前景。
作者:陳嵐 鮑可進單位:江蘇大學計算機科學與通信工程學院