? ? ? ? 上一篇博客已經說了cgi拿到了共享內存的程序還需要處理的才能夠真正刷新到網頁里面去
HTTP協議介紹
????????HTTP中文名稱是超文本傳輸協議,它是一個簡單的請求.響應協議,HTTP協議它運行在TCP上面,它是互聯網數據通信的基礎。 幾乎所有的網頁請求和互聯網處理都是根據HTTP協議進行處理。HTTP是一種用于分布式和超媒體信息系統的應用協議,值得注意的是HTTP是萬維網的數據通信基礎。
? ? ? ? 我們這個項目怎么通過http刷新到網頁里面去。
????????CGI程序通過HTTP協議把共享內存的RGB數據通過HTTP協議發送到BOA服務器,然后HTML界面再BOA服務器上面獲取數據。HTTP的視頻刷新通常由兩部分組成,第一個部分是HTTP視頻響應的頭部,第二部分是刷新具體的每一幀JPG字節流數據,具體的如上圖。
HTTP視頻響應頭部
要實現HTTP的視頻刷新,就必須要添加HTTP的響應頭部,下面是HTTP響應視頻的格式。
HTTP/1.0 200 OK\r\n
Server: Motion/4.1.1\r\n
Connection: close\r\n
Max-Age: 0\r\n
Expires: 0\r\n
Cache-Control: no-cache, p?rivate\r\n
Pragma: no-cache\r\n
Content-Type: multipart/x-mixed-replace; boundary=Hello_Harry
\r\n\r\n
我們來逐一解析上面的格式:
HTTP/1.0 200 OK\r\n指的是HTTP的1.0版本并且狀態是200(200指的是響應成功)
Server: Motion/4.1.1\r\n指的是HTTP動態處理圖像,版本是4.1.1
Connection: close\r\n指的是默認HTTP開始的時候,是關閉狀態
Max-Age: 0\r\n指的是存活時間為0
Expires: 0\r\n指的是過期時間為0
Cache-Control: no-cache, private\r\n指的是對數據不緩存,打開新窗口會重新訪問服務器
Pragma: no-cache\r\n指的也是數據不進行緩存
Content-Type: multipart/x-mixed-replace; boundary=Hello_Harry這一段是整個首部最重要的部分,它表示的是HTTP響應類型是流媒體數據(multipart/x-mixed-replace)如視頻流、音頻流,并且當每一個新的數據相應的時候就替換當前部分。這通常用不斷更新的內容,比方說:實時視頻流或者實時圖表數據;boundary后面的字段是自定義的
? ? ? ? 這個頭部,就是我們程序一啟動就響應一次。
HTTP刷新每一幀圖像的格式
填寫完頭部信息之后,就需要刷新每一幀的圖像數據,對于HTTP來說刷新每一幀圖像數據也有對應的格式,具體的如下所述
--Hello_Harry\r\nContent-type: image/jpeg\r\n\r\n (這個是放在死循環里面的,每一次的響應jpeg類型)
image_data
我們來解釋一下上面的格式:
--Hello_Harry\r\n這個是boundary字段,這個跟頭部創建的boundary字段一致
Content-type: image/jpeg\r\n\r\n指的是每次刷新的格式是jpeg的圖像格式
image_data指的就是具體的圖像數據,比方說每一幀的JPEG圖像格式(值得注意的是,對于HTTP圖像刷新格式都是JPG或者PNG格式的字節流)
HTTP刷新每一幀視頻的偽代碼實現
格式分析完了之后,我們來寫搞一段偽代碼來看一下如何實現HTTP刷新視頻
int main()
{//完成頭部的初始化"HTTP/1.0 200 OK\r\n";"Server: Motion/4.1.1\r\n";"Connection: close\r\n";"Max-Age: 0\r\n";"Expires: 0\r\n";"Cache-Control: no-cache, private\r\n";"Pragma: no-cache\r\n";"Content-Type: multipart/x-mixed-replace; boundary=Hello_Harry\r\n\r\n";while(1){//告訴服務器我每次要響應數據類型是jpeg字節流"--Hello_Harry\r\nContent-type: image/jpeg\r\n\r\n";//獲取這種的字節流get_image_data();}}
????????上面這段偽代碼是HTTP刷新視頻實現,首先先填寫HTTP的頭部響應信息,然后使用while(1)循環響應jpg的圖像格式,然后get_image_data(get_image_data是獲取圖像的方法)不斷獲取每一幀的jpg或者png的具體圖像字節流數據。?