新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 嵌入式遠程視頻采集系統的設計與實現

        嵌入式遠程視頻采集系統的設計與實現

        ——
        作者:張永強,趙永勇,李崇德 時間:2007-01-26 來源:《現代電子技術》 收藏


        多媒體通信技術的發展為信息的獲取和傳輸提供了豐富的手段,視頻采集是其中不可缺少的重要組成部分,該系統基于s3c2410的arm9芯片和嵌入式linux操作系統,采用usb攝像頭捕捉視頻,經mpeg-4算法壓縮編碼,系統直接與網絡相連,用戶使用標準的網絡瀏覽器和流媒體播放程序即可查看遠程視頻影像。

        本文引用地址:http://www.104case.com/article/20911.htm

        1 硬件系統

        系統硬件平臺選用北京博創公司的up-netarm2410開發板,該系統基于arm9架構嵌入式芯片s3c2410,穩定工作在202mhz主頻,板載64mb sdram 64mb flash,主板資源包括:主usb口、從usb口、10m/100m以太網口,觸摸屏、彩色lcd、鍵盤、8個用戶自定義led數碼管, a/d,rtc電路,2個串口、1個jtag通用接口,音頻模塊,支持mpeg4,mp3編解碼,3個168pin的擴展插座,32位的數據總線,保留充分擴展空間。

        其中標配模塊包括:ic卡+ps2模塊、ide硬盤+cf卡模塊、pcmcia+sd/mmc模塊。另外可選配模塊有:gps模塊,gprs模塊,fpga模塊,can+ad+da模塊、紅外模塊、藍牙模塊、攝像頭模塊。

        2 軟件系統

        2.1 內核配置與usb攝像頭驅動

        假定已經搭建好嵌入式linux的開發環境,下面第一步工作就是usb攝像頭的安裝與驅動。

        首先檢查linux kernel中是否已經添加了usb模塊的支持,并且加入video4linux支持。

        multimedia devices→<m>video for linux

        video for linux→[*]v4l information in proc filesystem

        在主菜單的usb support下還有各種攝像頭的驅動,選中將要使用的攝像頭芯片類型。

        <>usb ibm (xirlink)c-it camera support<*>usb ov511 camera support<>usb philips cameras

        <>usb se401 camera support<>usb stv680(pencam)camera support<>usb 3com homeconnect(akavicam)support

        在usb攝像頭選購時,優先考慮linux內核公開支持的攝像頭芯片,不然要額外編寫相應的usb攝像頭驅動程序,然后進行編譯、安裝。在此選用網眼公司的v3000產品,他采用了ov511的芯片。

        確定usb攝像頭被正常驅動后,下一步就是使用video4linux提供的api函數集來編寫視頻采集程序。

        2.2 基于v4l設計的視頻采集模塊

        在linux下,所有外設都被看成是一種特殊的文件,稱為設備文件。系統調用是內核和應用程序之間的接口,而設備驅動程序則是內核和外設之間的接口。他完成設備的初始化和釋放、對設備文件的各種操作和中斷處理等功能,為應用程序屏蔽了外設硬件的細節,使得應用程序可以像普通文件一樣對外設進行操作。

        linux系統中的視頻子系統video4linux為視頻應用程序提供了一套統一的api,視頻應用程序通過標準的系統調用即可操作各種不同的視頻捕獲設備。video4linux向虛擬文件系統注冊視頻設備文件,應用程序通過操作視頻設備文件實現對視頻設備的訪問。

        linux下與video4linux相關設備及用途如表1所示。

        這里主要針對設備文件/dev/video進行視頻捕捉方面的程序設計。

        linux下視頻采集流程如圖2所示。

        其中用到的主要函數有:

        camera_open():用來開啟視頻設備文件,使用前需要首先聲明一個video_device類型的設備文件。

        camera_get_capability():通過調用ioctl()函數取得設備文件的相關信息,并存放到video_capability結構里。

        camera_get_picture():通過調用ioctl()函數取得圖像的相關信息,并且存放到video_picture結構里。

        camera_close():用來關閉設備文件。

        camera_grab_image():用來抓取圖像,采用mmap方式,直接將設備文件/dev/video0映射到內存,加速文件i/o操作,還可以使多個線程共享數據。

        剩下的還有設備初始化、參數設備等相關函數,不再詳述。

        2.3 視頻壓縮編碼模塊

        獲取圖像數據后,可以直接輸出到framebuffer進行顯示,由于本系統要將采集到的視頻影響通過網絡傳輸出去,所以在傳輸之前要對原始的圖像數據進行壓縮編碼,在此選用mpeg-4視頻編解碼方案。和其他標準相比,mpeg-4壓縮比更高,節省存儲空間,圖像質量更好,特別適合在低帶寬條件下傳輸視頻,并能保持圖像的質量。

        mpeg-4中基于對象的視頻編碼過程可以分為3步進行:

        (1)從原始視頻流中分割視頻對象。

        (2)對視頻對象進行編碼,對不同視頻對象的運動信息、形狀信息、紋理信息分配不同的碼字。對輸入的任意形狀的vop序列,用基于塊的混合編碼技術編碼,處理順序是先ivop后pvop,bvop。在對vop的形狀信息編碼后,取得任意形狀vop的采樣,每個vop劃分為不相交的宏塊,每個宏塊含有4個8×8象素塊進行運動補償以及紋理編碼,已編碼的vop幀保存在幀存中,在當前vop幀和已編碼vop幀之間的計算運動矢量;對將編碼的塊和宏塊,計算他們的運動補償預測誤差;運動補償預測后的ivop及誤差用8×8塊dct變換,并進行dct系數的量化,然后是游程編碼和熵編碼。

        (3)對各個視頻對象的碼流進行復合,每個視頻對象的形狀、運動紋理信息復合成vol比特流,各視頻對象視頻流復合成統一的碼流輸出。對視頻流進行壓縮編碼以后,接下來就要實現網絡傳輸部分的功能。

        2.4 jrtplib網絡傳輸模塊

        流媒體指的是在網絡中使用流技術傳輸的連續時基媒體,rtp是目前解決流媒體實時傳輸問題的好辦法,jrtplib是一個面向對象的rtp庫,他完全遵循rfc1889設計,下面講述如何在linux平臺上運用rtp協議進行實時流媒體編程。

        2.4.1 初始化

        在使用jrtplib進行實時流媒體數據傳輸之前,首先應該生成rtpsession類的一個實例來表示此次rtp會話,然后調用create()方法來對其進行初始化操作。rtpsession類的create()方法只有一個參數,用來指明此次rtp會話所采用的端口號。

        2.4.2 數據發送

        當rtp會話成功建立起來之后,接下來就可以開始進行流媒體數據的實時傳輸了。首先需要設置好數據發送的目標地址,rtp協議允許同一會話存在多個目標地址,這可以通過調用rtpsession類的adddestination()、deletedestination()和cleardestinations()方法來完成。目標地址全部指定之后,接著就可以調用rtpsession類的sendpacket()方法,向所有的目標地址發送流媒體數據。

        2.4.3 數據接收

        對于流媒體數據的接收端,首先需要調用polldata()方法來接收發送過來的rtp或者rtcp數據報。由于同一個rtp會話中允許有多個參與者(源),因此既可以通過調用gotofirstsource()和gotonextsource()方法來遍歷所有的源,也可以通過調用gotofisstsourcewithdat()和gotonextsourcewithdata()方法來遍歷那些攜帶有數據的源。在從rtp會話中檢測出有效的數據源之后,接下去就可以調用rtpsession類的getnextpacket()方法從中抽取rtp數據報,當接收到的rtp數據報處理完之后,要及時釋放。

        jrtplib為rtp數據報定義了3種接收模塊,通過調用rtpsession類的setreceivemode()方法可以設置下列這些接收模式:

        receivemode_all:缺省的接收模式,所有到達的rtp數據報都將被接受;

        receivemode_ignoresome:除了某些特定的發送者之外,所有到達的rtp數據報都將被接受,而被拒絕的發送者列表可以通過調用addtoignorelist(),deletefromignorelist()和clearignorelist()方法來進行設置;

        receivemode_acceptsome:除了某些特定的發送者之外,所有到達的rtp數據報都將被拒絕,而被接受的發送者列表可以通過調用addtoacceptlist(),deletefromacceptlist和clearacceptlist()方法來進行設置。

        2.4.4 控制信息

        jrtplib是一個高度封裝后的rtp庫,只要polldata()或者sendpacket()方法被成功調用,jrtplib就能夠自動對達到的rtcp數據報進行處理,并且還會需在要的時候發送rtcp數據報,從而能夠確保整個rtp會話過程的正確性。

        在本系統中,使用rtpsession jrtplib類庫提供的方法來實現底層的rtp/rtcp操作,并且把他封裝在crtptransmitter類中,該類從media sink類繼承而來,接收到相應的媒體幀數據,使用rtpsession類庫的操作把數據發送到網絡上。

        3 結語

        本系統基于s3c2410平臺和linux操作系統,利用video4linux設計采集程序,使用mpeg-4壓縮編碼算法,通過實時流媒體傳輸技術實現了網絡傳輸,整個系統具有穩定可靠、安裝簡便、成本低廉等特點,可擴展應用在工業控制、視頻會議系統、可視電話、遠程監控系統等諸多領域。



        關鍵詞:

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 光泽县| 乳山市| 耒阳市| 鸡东县| 吴忠市| 太原市| 革吉县| 垫江县| 靖西县| 湄潭县| 自治县| 长垣县| 宜春市| 历史| 黎川县| 开化县| 图木舒克市| 永宁县| 花垣县| 乌拉特中旗| 黎川县| 渝中区| 澎湖县| 吴江市| 云龙县| 山丹县| 平陆县| 桦甸市| 扬州市| 蒙城县| 黄石市| 安化县| 南充市| 阳朔县| 自治县| 淄博市| 响水县| 隆德县| 衡阳市| 扶余县| 荣昌县|