歡迎您光臨本站 註冊首頁

嵌入式Linux的web視頻伺服器的構建

←手機掃碼閱讀     火星人 @ 2014-03-09 , reply:0

隨著嵌入式處理器和開源Linux 的廣泛應用,各種視頻服務在嵌入式系統中逐漸發展起來.

1.引言

隨著多媒體技術、視頻壓縮編碼技術、網路通訊技術的發展,數字視頻伺服器逐漸發展起來.近年來隨著嵌入式處理器和開源Linux 的廣泛應用,視頻服務已逐漸與嵌入式相結合.本文提出了一種嵌入式 web 視頻伺服器的構建方法,該系統以嵌入式 Linux 和 S3C2440 為核心平台;在這個平台上構建 web 伺服器和視頻伺服器,客戶可以直接通過瀏覽網頁的方式觀看視頻.

2.視頻採集傳輸模塊的構建

本系統採用的硬體平台是基於 ARM920T架構的嵌入式開發板 S3C2440,CPU 主頻400MHz,該開發板集成了64MB 32 位的 SDRAM 和 64MB 的NANDFLASH,三個USB host 口,3 路UART,4 路DMA,一個採用CS8900Q3 乙太網控制晶元的10M 網路介面等.攝像頭採用中星微301 晶元的USB 攝像頭.本系統軟體部分由視頻採集傳輸模塊和web 伺服器組成.

2.1 視頻採集模塊

在進行視頻採集前需要先安裝驅動,video4Linux 是 Linux 中關於視頻設備的內核驅動,它為針對視頻設備的應用程序編程提供統一的編程介面.本系統的 S3C2440 開發板自帶的是Linux2.6.12 內核,該內核編譯時已加進關於視頻設備的內核驅動Video4Linux[1].使用video4Linux 進行採集視頻的流程圖如圖 1 .

(1) 設備的初始化

調用 open 打開設備,利用 ioctl()對設備進行控制,比如設置對比度、亮度、調色板, 訪問模式等等.主要代碼如下:

int fd = open(“/dev/v4l/video0”,O_RDWR); //打開設備
/* 獲取設備的基本信息(設備名稱、支持的最大最小解析度、信號源信息等)*/
ioctl(vd->fd, VIDIOCGCAP, &(vd->capability)):


/* 獲取設備採集的圖象的各種屬性 /*
ioctl(vd->fd, VIDIOCGPICT, &(vd->picture));
/* 如果需要改變圖像的信息,先改變 picture 中的相應的變數值,再調用 ioctl(vd->fd,
VIDIOCSPICT, &(vd->picture))即可,本程序初始化全部採用默認值 */

(2)採集圖像

本系統使用內存映射的方式採集圖像,線程採集函數grab()主要代碼如下:

/* 分配一段內存,存放採集到的圖像數據 */
vd->pFramebuffer =(unsigned char *) mmap (0, vd->videombuf.size, PROT_READ| PROT_WRITE,MAP_SHARED, vd->fd, 0);
for(;;)
{
/* 開始截取一幀圖像,使用內存映射的方式*/
if ((ioctl (vd->fd, VIDIOCMCAPTURE, &(vd->vmmap))) < 0)
{
perror ("vidiocmcapture errorn");
erreur = -1;
}
/* 等待一幀數據採集完畢,採集到的圖像數據就放到了 vd->pFramebuffer 起始的內存地址內,大小為vd->videombuf.size 位元組 */
if (ioctl (vd->fd, VIDIOCSYNC, &vd->vmmap.frame) < 0)
{
perror ("vidiocsync errorn");
erreur = -1;
}
}

然後在main 函數中創建採集線程,pthread_create (&w1, NULL, (void *) grab, NULL); 該線程一直運行,不斷採集圖像數據,同時把數據放到緩衝區內,發送線程從緩衝區讀取視頻數據.


2.2 視頻傳輸模塊

本系統支持多個客戶同時訪問,所以為每個連接的客戶端創建一個線程,專門負責與客戶端進行數據交互.調用 socket()創建套介面,然後bind()綁定7000 埠到該套介面,調用 listen()監聽該套介面,等待客戶端的連接,調用 accept()與客戶端建立連接.視頻傳輸模塊的流程如圖3:

下面給出創建線程的關鍵代碼:

while (signalquit) //如果沒有退出信號就一直運行下去

{

/* 等待客戶端的連接,如果沒有連接就一直阻塞下去,如果有客戶連接就創建一

個線程,在新的套介面上與客戶端進行數據交互 */
if ((new_sock = accept(serv_sock, (struct sockaddr *)&their_addr, &sin_size)) == -1)
{
continue;
}
pthread_create(&server_th, NULL, (void *)service, &new_sock);
}

線程函數 server()主要是讀緩衝區數據,寫入套介面,同時讀取套介面的數據,設置下一次採集圖像的屬性,這裡就不再給出代碼.

3.嵌入式web 伺服器

嵌入式 web 伺服器就是把 web 伺服器移植到嵌入式系統的伺服器.它仍然是基於http文本協議進行通信的,具有標準的介面形式,對客戶端來說,訪問嵌入式 web 伺服器就和訪問普通的web 服務一樣.Boa 是一個小巧的web 伺服器,可執行代碼只有70KB,佔用的系統資源少,速度快安全性能高,本系統採用的就是boa伺服器,下載源碼解壓后,需要修改makefile文件,把其中變數 CC 的值改成arm-linux-gcc,LD 改成arm-linux-ld,然後make 就可以生成boa 應用程序了,下載boa 和boa.conf 到開發板上,然後根據開發板文件系統,修改boa.conf配置文件,比如日誌路徑,web 根目錄等,把web 頁面放入根目錄,boa 通過讀取配置文件里的根目錄內容,就可以返回用戶請求的web 頁面了.

本系統的Web 頁面用HTML 語言設計,如果想通過該web 頁面傳輸視頻數據,需要一
個applet 小程序[7],該程序通過HTML 語言中的applet 標記引入,下面是引入applet 程序的

代碼:

<applet codebase="." archive="JWebcamPlayer.jar" code="JWebcamPlayer.class"
name="JWebcamPlayer" ID="JWebcamPlayer" align="center" width="400" height="400"
MAYSCRIPT>
<param name="Color" value="#ffffff">
<param name="Server" value="">
<param name="Port" value="7000">
<PARAM NAME="scriptable" value="true">
<PARAM NAME="mayscript" value="true">
</applet>

Codebase 和code 屬性給出applet 類的完整路徑,align 是applet 窗口顯示的位置,width和height 是applet 窗口的大小,Port 是伺服器端的視頻採集程序的綁定埠,Server 是伺服器地址的值,不過是在JWebcamPlayer.java 程序中通過gethost()得到,所以這裡設置為空.該applet 程序調用 JWebcamPlayer.jar 包與伺服器端的視頻發送線程進行數據交互,並在瀏覽器上顯示視頻.

JWebcamPlayer 程序獲取埠傳入的數據並解析,生成對象,輸出到Frame 對象中,完成視頻播放,可以達到20fps 的幀率.

該applet 小程序以及JWebcamPlayer.jar 是保存在web 伺服器上的,當用戶訪問web 伺服器觀看視頻時,該程序自動裝載到網頁里,由用戶的瀏覽器解釋執行.Applet 被調用時,自動執行JWebcamPlayer.jar 包,該包進行一些 socket 和圖像顯示的初始化工作,比如上段說的得到伺服器IP,埠,設置顏色值等,然後調用 start()連接視頻伺服器,播放視頻.web 伺服器和客戶端的交互圖如圖2 所示.

4.系統試驗

本系統的測試在區域網內進行.客戶端使用的是 Windows XP 操作系統,瀏覽器使用Windows XP 自帶的IE 瀏覽器,播放程序包含java 控制項,需要先安裝 JRE,讓瀏覽器支持java 控制項.伺服器端使用的是TE2440 自帶的Linux 操作系統,把攝像頭插入開發板的USB 介面,通過網線把開發板接入本地區域網,通過串口終端把開發板IP 設為本地地址:222.22.66.246 , 啟動視頻採集程序和web 伺服器 .

5.結束語

本文介紹了一種嵌入式 web 視頻伺服器系統的構建方法,該系統已經在 S3C2440 開發板上實現,可以在區域網內使用.對該系統稍加改進,比如加入視頻編碼,流控制等,即可實現遠程的視頻通信.在項目開發周期中,企業考慮最多的便是所需要投入的研發人員數量以及由此所產生的人力資源費用.在即時通訊領域,如果企業組建團隊全部自己來開發,將會遇到多方面的困難,其中包括:1)、所涉及到的技術面較多,包括音視頻採集、編解碼、流媒體傳輸、P2P技術、混音技術等,組建一個團隊需用多方面的人才;2)、所涉及到的技術都是底層技術,要求團隊成員有非常豐富的開發經驗,需要對底層技術有較高的造詣,需要精通C 編程,否則項目的風險將不可控;3)、開發是一個長期的過程,企業將面臨居多的風險,所需要的開發費用將成為企業的負擔.使用AnyChat SDK可以讓企業關注自身的業務需求,由於AnyChat SDK支持VC 、Delphi、C#、VB.Net等開發語言,所以企業組織開發團隊時可根據自身的研發力量靈活決策,以較小的人力資源投入獲得較高的收益.


[火星人 ] 嵌入式Linux的web視頻伺服器的構建已經有932次圍觀

http://coctec.com/docs/linux/show-post-48517.html