国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

面向視頻監(jiān)控的流媒體服務(wù)研究與實(shí)現(xiàn)

2018-06-21 10:17李聞斌
關(guān)鍵詞:流媒體時(shí)間軸

李聞斌

【摘 要】通過研究RTSP協(xié)議,實(shí)現(xiàn)流媒體服務(wù)通過RTSP地址接收來自多臺編碼器、NVR、DVR傳輸過來的實(shí)時(shí)視頻圖像,并轉(zhuǎn)發(fā)給多個(gè)客戶端進(jìn)行實(shí)時(shí)圖像瀏覽,避免客戶端直接訪問前端攝像機(jī),降低網(wǎng)絡(luò)流量和數(shù)據(jù)對網(wǎng)絡(luò)的占用;同時(shí)既可單文件轉(zhuǎn)發(fā),也可時(shí)間軸方式轉(zhuǎn)發(fā)歷史視頻給客戶端,并提供歷史視頻下載。

【Abstract】Through studying the RTSP protocol, the streaming media service can receive real-time video images transmitted from multiple encoders, NVR and DVR through the RTSP address, and forward to multiple clients for real-time image browsing, which avoids direct access to front-end cameras by clients, reduce the network traffic and data occupation of the network.At the same time,it can forward history video to client in either single file or time axis mode, and provide history video download.

【關(guān)鍵詞】RTSP協(xié)議; 流媒體; 實(shí)時(shí)視頻; 時(shí)間軸; 視頻下載

【Keywords】RTSP protocol; streaming media; real-time video; time axis; video download

【中圖分類號】G354 【文獻(xiàn)標(biāo)志碼】A 【文章編號】1673-1069(2018)05-0153-03

1引言

隨著經(jīng)濟(jì)社會的發(fā)展,各地都在大力推廣平安城市、智慧城市,而大量視頻監(jiān)控系統(tǒng)建設(shè)起來后卻面臨著一個(gè)重要問題:如何共享海量的歷史視頻。由于各個(gè)視頻廠家的歷史視頻格式都不一樣,都必須得用他們自己的解碼庫來解碼播放,這就導(dǎo)致要播放如此多種類的視頻就得準(zhǔn)備幾個(gè)甚至十幾個(gè)不同的播放器,同時(shí)還不能用視頻編輯工具對它們進(jìn)行編輯。本文討論的流媒體服務(wù),通過RTSP地址接收攝像頭的音視頻流,再以標(biāo)準(zhǔn)RTSP轉(zhuǎn)發(fā)實(shí)時(shí)音視頻,對音視頻不做任何處理;同時(shí)歷史視頻即可點(diǎn)播,也可時(shí)間軸(時(shí)間段)播放,還可下載保存為標(biāo)準(zhǔn)MP4格式,可用普通播放器播放,如VLC、暴風(fēng)影音。

2 技術(shù)介紹

2.1 IOCP模型

IOCP全稱I/O Completion Port,中文譯為I/O完成端口。IOCP是一個(gè)異步I/O的API,它可以高效地將I/O事件通知給應(yīng)用程序,適用于能控制并發(fā)執(zhí)行的高負(fù)載服務(wù)器的一個(gè)技術(shù),就是用于高效處理很多很多的客戶端進(jìn)行數(shù)據(jù)交換的一個(gè)模型[1]。

本文實(shí)現(xiàn)的流媒體服務(wù)應(yīng)用于windows平臺,采用IOCP模型可以實(shí)現(xiàn)多線程快速處理多客戶端的各種請求,有效避免因程序造成的等待。

2.2 SDK技術(shù)

軟件開發(fā)工具包(外語首字母縮寫:SDK、外語全稱:Software Development Kit)一般都是一些軟件工程師為特定的軟件包、軟件框架、硬件平臺、操作系統(tǒng)等建立應(yīng)用軟件時(shí)的開發(fā)工具的集合[2]。

每個(gè)視頻設(shè)備生產(chǎn)廠家為獲取音視頻流、控制云臺、亮度、色度等以及存儲歷史視頻文件及播放功能等等,都有相應(yīng)的SDK開發(fā)包。由于沒有國家標(biāo)準(zhǔn),每個(gè)SDK對實(shí)時(shí)流和歷史視頻的定義和格式都不一樣,形成了各種技術(shù)壁壘,無形中阻礙了視頻的共享,特別是歷史視頻的共享。

2.3 RTSP協(xié)議[3]

實(shí)時(shí)流協(xié)議(RTSP)是應(yīng)用級協(xié)議,控制實(shí)時(shí)數(shù)據(jù)的發(fā)送。該協(xié)議用于C/S模型,是一個(gè)基于文本的協(xié)議,用于在客戶端和服務(wù)器端建立和協(xié)商實(shí)時(shí)流會話。RTSP在體系結(jié)構(gòu)上位于RTP和RTCP之上,它使用TCP或UDP完成數(shù)據(jù)傳輸。

經(jīng)研究發(fā)現(xiàn)每個(gè)視頻設(shè)備生產(chǎn)廠家的視頻監(jiān)控設(shè)備(攝像頭)都可以通過RTSP地址直接獲得音視頻流,RTSP地址如:rtsp://user:pwd@%IP:554/h264/ch1/sub/av_stream或rtsp://user:pwd@%IP:554/stream1,只要獲得用戶名和密碼就可以直接訪問設(shè)備獲取實(shí)時(shí)流,極大的方便后續(xù)的開發(fā),如:存儲歷史視頻、視頻播放器。

3 流媒體服務(wù)的實(shí)現(xiàn)

流媒體服務(wù)通過跨網(wǎng)段以及跨平臺轉(zhuǎn)發(fā)視頻流服務(wù)提高了視頻聯(lián)網(wǎng)平臺視頻流管理以及傳輸?shù)姆€(wěn)定性、高效性和合理性,為用戶請求實(shí)時(shí)和歷史視頻提供了快速的響應(yīng)速度以及詳細(xì)的反饋信息[4-5]。

由于流媒體服務(wù)主要功能是視頻轉(zhuǎn)發(fā)[6] 和視頻回放,也就是實(shí)時(shí)視頻數(shù)據(jù)流轉(zhuǎn)發(fā)和歷史視頻數(shù)據(jù)流轉(zhuǎn)發(fā)。實(shí)時(shí)視頻數(shù)據(jù)流通過RTSP地址直接從視頻監(jiān)控設(shè)備(攝像頭)獲得,歷史視頻數(shù)據(jù)流則通過讀取存儲在存儲服務(wù)器上的歷史視頻文件獲得。

歷史視頻數(shù)據(jù)流又分為單視頻數(shù)據(jù)流和時(shí)間軸視頻數(shù)據(jù)流。單視頻數(shù)據(jù)流很好理解就是讀取存儲服務(wù)器上的單個(gè)歷史視頻文件形成視頻數(shù)據(jù)流進(jìn)行傳輸,時(shí)間軸視頻數(shù)據(jù)流則要求讀取多個(gè)歷史視頻文件的數(shù)據(jù)媒體信息將它們整合形成一個(gè)視頻數(shù)據(jù)流信息來進(jìn)行傳輸。這是由于高清視頻文件的存儲時(shí)間一般在10分鐘左右,如果要查看20分鐘的視頻,普通操作(單視頻播放)是播放完一個(gè)再選擇下一個(gè)播放,很不方便,通過時(shí)間軸的方式播放視頻只需要用戶選擇好開始時(shí)間和結(jié)束時(shí)間即可觀看此時(shí)間段內(nèi)的視頻,特別是案件發(fā)生時(shí)間持續(xù)兩個(gè)視頻文件,可以省去在兩個(gè)歷史視頻文件間切換的時(shí)間,進(jìn)而流暢的觀看整個(gè)過程。

此外,流媒體服務(wù)還提供下載功能。下載也分為單視頻下載和時(shí)間軸視頻下載。

由于實(shí)時(shí)視頻數(shù)據(jù)流轉(zhuǎn)發(fā)和歷史視頻數(shù)據(jù)流轉(zhuǎn)發(fā)請求,以及歷史視頻的下載都涉及到RTSP協(xié)議的應(yīng)用,本文著重講述RTSP客戶端和服務(wù)端的實(shí)現(xiàn)及在流媒體服務(wù)中的應(yīng)用。

3.1 RTSP客戶端

實(shí)時(shí)視頻數(shù)據(jù)流通過RTSP地址直接從視頻監(jiān)控設(shè)備(攝像頭)獲得,此時(shí)流媒體服務(wù)作為RTSP客戶端,通過RTSP協(xié)議請求視頻監(jiān)控設(shè)備上的服務(wù)程序來獲得實(shí)時(shí)視頻數(shù)據(jù)流。利用C++語言實(shí)現(xiàn)RTSP協(xié)議的Client: class MRTSPClient。

類MRTSPClient完成連接設(shè)備服務(wù)、請求options、請求describe、解析SDP、請求setup、請求play和請求teardown。

主要函數(shù)包括:

bool openUrl(); //連接設(shè)備服務(wù)

int request_options();//請求options

int request_describe();//請求describe

int parseSDP();//解析SDP

int request_setup(); //請求setup

int request_play();//請求play

int request_teardown();//請求teardown

3.2 RTSP服務(wù)端

在轉(zhuǎn)發(fā)實(shí)時(shí)視頻數(shù)據(jù)流、歷史視頻數(shù)據(jù)流和歷史視頻文件下載時(shí),流媒體服務(wù)作為RTSP服務(wù)端,接收客戶端的連接和請求。利用C++語言實(shí)現(xiàn)IOCP模型和解析RTSP協(xié)議請求函數(shù)。

類CRTSPSocket實(shí)現(xiàn)IOCP模型,主要函數(shù)包括:

bool _InitializeIOCP();// 初始化IOCP

bool _InitializeListenSocket();// 初始化Socket

static DWORD WINAPI _WorkerThread();//為IOCP請求服務(wù)的工作者線程

static DWORD WINAPI _ClientHandle();//管理接入客戶的線程

bool _DoRecv();//接收客戶端RTSP協(xié)議數(shù)據(jù)并交由ParseMessage函數(shù)處理

RTSP協(xié)議解析函數(shù)包括:

void ParseMessage();//分配處理

int handleCmd_Option();//解析option請求

int handleCmd_Describe();//解析describe請求

int handleCmd_Setup();//解析setup請求

int handleCmd_Play();//解析play請求

int handleCmd_Teardown();//解析teardown請求

在處理時(shí)間軸視頻流時(shí)需要讀取多個(gè)歷史視頻文件的媒體信息并整合形成一個(gè)視頻流,使用到的函數(shù)openFile(list &fileList;, uint64_t startTime, uint64_t endTime, int nMode);//nMode:1播放,2下載

具體的歷史視頻文件的媒體信息整合算法如下:

for (list::iterator iter = m_fileList.begin(); iter != m_fileList.end(); iter++)

{

RecordInfo* pRecordInfo = (RecordInfo*)*iter;

if (dateDiff(pRecordInfo->sEndTime, sTime, SECOND) > 0)

continue;

if (sBeginTime == "0")

sBeginTime = pRecordInfo->sBeginTime;

if (dateDiff(eTime, pRecordInfo->sBeginTime, SECOND) >= 0)

break;

string strFilePath = pRecordInfo->sFilePath;

FILE* pFilefp = fopen(strFilePath.c_str(), "rb");

if (pFilefp == NULL)

{

pRecordInfo->m_bFileIsExist = FALSE;

continue;

}

fclose(pFilefp);

string fileHead = strFilePath + ".list";

FILE* pFileHeadfp = fopen(fileHead.c_str(), "rb");

if (pFileHeadfp == NULL)

{

pRecordInfo->m_bFileIsExist = FALSE;

continue;

}

pRecordInfo->m_bFileIsExist = TRUE;

pRecordInfo->m_bLastFile = FALSE;

stFileHead stfileHead;

memset(&stfileHead;, 0, sizeof(stFileHead));

fread(&stfileHead;, 1, sizeof(stFileHead), pFileHeadfp);

pRecordInfo->m_dwTimeCount = stfileHead.m_dwTimeCount;//總時(shí)間

pRecordInfo->m_dwIFrameCount = stfileHead.m_dwIFrameCount;//I幀總數(shù)

pRecordInfo->m_pszFrameHead = new stFrameHead[stfileHead.m_dwIFrameCount];

memset(pRecordInfo->m_pszFrameHead, 0, sizeof(stFrameHead)*stfileHead.m_dwIFrameCount);

fread(pRecordInfo->m_pszFrameHead, 1, sizeof(stFrameHead)*stfileHead.m_dwIFrameCount, pFileHeadfp);

fclose(pFileHeadfp);

secTime[vid_idx] += pRecordInfo->m_dwTimeCount;

secFrame[vid_idx] += stfileHead.m_dwIFrameCount;

sEndTime = pRecordInfo->sEndTime;

}

double startDiff, endDiff;

startDiff = dateDiff(sBeginTime, sTime, SECOND);//開始時(shí)間與第一個(gè)錄像文件的錄像開始時(shí)間相差的秒數(shù)

endDiff = dateDiff(eTime, sEndTime, SECOND);//結(jié)束時(shí)間與最后一個(gè)錄像文件的錄像結(jié)束時(shí)間相差的秒數(shù)

startPos = startDiff >= 0 ? startDiff : 0;

endPos = endDiff >= 0 ? endDiff : 0;

//校驗(yàn)播放總時(shí)間

secTime[vid_idx] -= startDiff;

secTime[vid_idx] -= endDiff;

frameRate[vid_idx] = 25;//暫時(shí)用25

_sample_rate[vid_idx] = 90000;

m_iterFile = m_fileList.begin();

RecordInfo* pRecordInfo = (RecordInfo*)*m_iterFile;

startDur = (startDiff * pRecordInfo->m_dwIFrameCount) / pRecordInfo->m_dwTimeCount;

pRecordInfo = (RecordInfo*)(m_fileList.back());

pRecordInfo->m_bLastFile = TRUE;

endDur = pRecordInfo->m_dwIFrameCount - (endDiff * pRecordInfo->m_dwIFrameCount) / pRecordInfo->m_dwTimeCount;

//校驗(yàn)I幀總數(shù)

secFrame[vid_idx] -= startDur;

secFrame[vid_idx] -= endDur;

4 小結(jié)

本文提出的基于IOCP和RTSP的流媒體服務(wù)主要是面向視頻監(jiān)控系統(tǒng),通過RTSP地址直接從視頻監(jiān)控設(shè)備(攝像頭)獲得實(shí)時(shí)流,此方法成功繞開了設(shè)備廠家的SDK,降低了對設(shè)備廠家SDK的依賴,既可以加速后續(xù)新廠家設(shè)備的加入,也實(shí)現(xiàn)了歷史視頻文件的統(tǒng)一格式,形成標(biāo)準(zhǔn)的MP4文件供查看及播放,在一定程度上實(shí)現(xiàn)了兼容性的視頻監(jiān)控系統(tǒng),避免了信息孤島的形成,同時(shí)兼具可擴(kuò)展性、可移植性。

【參考文獻(xiàn)】

【1】百度百科. https://baike.baidu.com/item/IOCP/9207102?fr=aladdin, 2018

【2】百度百科. https://baike.baidu.com/item/sdk/7815680,2017.

【3】SCHULZRINNE H, RAO A, LANPHIER R. RFC 2326, Real time streaming protocol[S]. 1998

【4】趙心翔,傅秀芬.復(fù)雜硬件環(huán)境下流媒體服務(wù)器的設(shè)計(jì)實(shí)現(xiàn)[J].網(wǎng)絡(luò)新媒體技術(shù),2011,32(1):31-36

【5】吳超.流媒體服務(wù)器在遠(yuǎn)程監(jiān)控中的應(yīng)用[J].港口科技,2013(8):37-41.

【6】李婷,張武,陳曉.一種基于多核網(wǎng)絡(luò)處理器的流媒體轉(zhuǎn)發(fā)單元的實(shí)現(xiàn)[J].網(wǎng)絡(luò)新媒體技術(shù), 2012,01(2):28-33.

猜你喜歡
流媒體時(shí)間軸
此刻即是新掬之水
就地取材制作個(gè)性化PPT時(shí)間軸
輕松實(shí)現(xiàn)PPT圖片局部放大
流媒體傳輸加密技術(shù)研究
基于JSP的流媒體播放的設(shè)計(jì)與實(shí)現(xiàn)
網(wǎng)絡(luò)遠(yuǎn)程教學(xué)系統(tǒng)的設(shè)計(jì)
基于云服務(wù)的P2P流媒體技術(shù)在遠(yuǎn)程教學(xué)視頻傳輸中的應(yīng)用
基于RTMFP協(xié)議的視頻監(jiān)控系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)
基于時(shí)間軸的媒體數(shù)據(jù)編輯專利技術(shù)綜述
流媒體集群并發(fā)技術(shù)在視頻點(diǎn)直播系統(tǒng)中的應(yīng)用
襄樊市| 昭通市| 崇信县| 清镇市| 武夷山市| 芮城县| 岑巩县| 昔阳县| 邵阳市| 边坝县| 阿拉善盟| 松江区| 瑞金市| 洪江市| 武威市| 札达县| 嘉黎县| 镇坪县| 屯昌县| 遂溪县| 正阳县| 浑源县| 牟定县| 郎溪县| 威宁| 绵阳市| 沛县| 大邑县| 榆社县| 南丰县| 安塞县| 蛟河市| 广安市| 临城县| 平湖市| 宜春市| 叙永县| 思茅市| 平江县| 梁山县| 双城市|