随着嵌入式處理器和開源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 error\n");
erreur = -1;
}
/* 等待一幀資料采集完畢,采集到的圖像資料就放到了 vd->pFramebuffer 起始的記憶體位址内,大小為vd->videombuf.size 位元組 */
if (ioctl (vd->fd, VIDIOCSYNC, &vd->vmmap.frame) < 0)
perror ("vidiocsync error\n");
}
}
然後在main 函數中建立采集線程,pthread_create (&w1, NULL, (void *) grab, NULL); 該線程一直運作,不斷采集圖像資料,同時把資料放到緩沖區内,發送線程從緩沖區讀取視訊資料。
<a target="_blank" href="http://blog.51cto.com/attachment/201012/104631172.jpg"></a>
2.2 視訊傳輸子產品
本系統支援多個客戶同時通路,是以為每個連接配接的用戶端建立一個線程,專門負責與用戶端進行資料互動。首先調用 socket()建立套接口,然後bind()綁定7000 端口到該套接口,調用 listen()監聽該套接口,等待用戶端的連接配接,最後調用 accept()與用戶端建立連接配接。視訊傳輸子產品的流程如圖3:
<a target="_blank" href="http://blog.51cto.com/attachment/201012/104537843.jpg"></a>
下面給出建立線程的關鍵代碼:
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等開發語言,是以企業組織開發團隊時可根據自身的研發力量靈活決策,以較小的人力資源投入獲得較高的收益。
本文轉自 fanxiaojun 51CTO部落格,原文連結:http://blog.51cto.com/2343338/446869,如需轉載請自行聯系原作者