999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

面向視頻監控的流媒體服務研究與實現

2018-06-21 10:17:46李聞斌

李聞斌

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

【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.

【關鍵詞】RTSP協議; 流媒體; 實時視頻; 時間軸; 視頻下載

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

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

1引言

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

2 技術介紹

2.1 IOCP模型

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

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

2.2 SDK技術

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

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

2.3 RTSP協議[3]

實時流協議(RTSP)是應用級協議,控制實時數據的發送。該協議用于C/S模型,是一個基于文本的協議,用于在客戶端和服務器端建立和協商實時流會話。RTSP在體系結構上位于RTP和RTCP之上,它使用TCP或UDP完成數據傳輸。

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

3 流媒體服務的實現

流媒體服務通過跨網段以及跨平臺轉發視頻流服務提高了視頻聯網平臺視頻流管理以及傳輸的穩定性、高效性和合理性,為用戶請求實時和歷史視頻提供了快速的響應速度以及詳細的反饋信息[4-5]。

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

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

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

由于實時視頻數據流轉發和歷史視頻數據流轉發請求,以及歷史視頻的下載都涉及到RTSP協議的應用,本文著重講述RTSP客戶端和服務端的實現及在流媒體服務中的應用。

3.1 RTSP客戶端

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

類MRTSPClient完成連接設備服務、請求options、請求describe、解析SDP、請求setup、請求play和請求teardown。

主要函數包括:

bool openUrl(); //連接設備服務

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服務端

在轉發實時視頻數據流、歷史視頻數據流和歷史視頻文件下載時,流媒體服務作為RTSP服務端,接收客戶端的連接和請求。利用C++語言實現IOCP模型和解析RTSP協議請求函數。

類CRTSPSocket實現IOCP模型,主要函數包括:

bool _InitializeIOCP();// 初始化IOCP

bool _InitializeListenSocket();// 初始化Socket

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

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

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

RTSP協議解析函數包括:

void ParseMessage();//分配處理

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

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

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

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

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

在處理時間軸視頻流時需要讀取多個歷史視頻文件的媒體信息并整合形成一個視頻流,使用到的函數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;//總時間

pRecordInfo->m_dwIFrameCount = stfileHead.m_dwIFrameCount;//I幀總數

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);//開始時間與第一個錄像文件的錄像開始時間相差的秒數

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

startPos = startDiff >= 0 ? startDiff : 0;

endPos = endDiff >= 0 ? endDiff : 0;

//校驗播放總時間

secTime[vid_idx] -= startDiff;

secTime[vid_idx] -= endDiff;

frameRate[vid_idx] = 25;//暫時用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;

//校驗I幀總數

secFrame[vid_idx] -= startDur;

secFrame[vid_idx] -= endDur;

4 小結

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

【參考文獻】

【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】趙心翔,傅秀芬.復雜硬件環境下流媒體服務器的設計實現[J].網絡新媒體技術,2011,32(1):31-36

【5】吳超.流媒體服務器在遠程監控中的應用[J].港口科技,2013(8):37-41.

【6】李婷,張武,陳曉.一種基于多核網絡處理器的流媒體轉發單元的實現[J].網絡新媒體技術, 2012,01(2):28-33.

主站蜘蛛池模板: 国产精品手机视频| 欧洲日本亚洲中文字幕| 亚洲色图欧美视频| 无码福利日韩神码福利片| 国产高颜值露脸在线观看| 欧美va亚洲va香蕉在线| 亚洲欧美在线综合图区| 久久精品无码一区二区国产区 | 日韩人妻少妇一区二区| 国产91透明丝袜美腿在线| 欧美午夜视频在线| 狠狠色噜噜狠狠狠狠色综合久| 国产偷国产偷在线高清| 亚洲精品国产精品乱码不卞| h视频在线播放| 国产日韩AV高潮在线| 很黄的网站在线观看| 超级碰免费视频91| 国产a在视频线精品视频下载| 日韩精品免费一线在线观看 | 爽爽影院十八禁在线观看| 成人中文在线| 国产黄在线免费观看| 红杏AV在线无码| 91在线播放国产| 在线免费看黄的网站| 久久大香伊蕉在人线观看热2| 亚洲无码不卡网| 亚洲欧洲天堂色AV| 成人毛片免费在线观看| 欧美、日韩、国产综合一区| yjizz国产在线视频网| 人人爱天天做夜夜爽| 精品综合久久久久久97超人该| 99999久久久久久亚洲| 在线亚洲小视频| 日韩欧美国产综合| 人人爽人人爽人人片| 国产人在线成免费视频| 亚洲欧美综合另类图片小说区| 国产精品青青| 日韩A∨精品日韩精品无码| 高清码无在线看| 91青青视频| 亚洲欧美日韩精品专区| 欧美成人精品高清在线下载| 久久午夜夜伦鲁鲁片不卡| 黄色网页在线播放| 成人小视频网| 国产欧美高清| yy6080理论大片一级久久| 奇米影视狠狠精品7777| av天堂最新版在线| 1024国产在线| 免费国产小视频在线观看| 国产成人高清在线精品| 四虎成人免费毛片| 成人午夜网址| 久久人午夜亚洲精品无码区| 国产成人精品一区二区秒拍1o| 亚洲V日韩V无码一区二区| 国产菊爆视频在线观看| 黄色免费在线网址| 亚洲精选无码久久久| 国产一国产一有一级毛片视频| 丰满少妇αⅴ无码区| 国产在线无码一区二区三区| 国产成人久久777777| 中文毛片无遮挡播放免费| 在线综合亚洲欧美网站| 亚洲 欧美 日韩综合一区| 国产91丝袜在线播放动漫| a级毛片一区二区免费视频| 国产一区二区三区在线精品专区 | 国产亚洲精品va在线| 日韩123欧美字幕| 有专无码视频| 午夜丁香婷婷| 激情综合五月网| 九月婷婷亚洲综合在线| 久久精品人人做人人爽97| 欧美精品在线观看视频|