新聞資訊  快訊  焦點  財經  政策  社會
互 聯 網   電商  金融  數據  計算  技巧
生活百科  科技  職場  健康  法律  汽車
手機百科  知識  軟件  修理  測評  微信
軟件技術  應用  系統  圖像  視頻  經驗
硬件技術  知識  技術  測評  選購  維修
網絡技術  硬件  軟件  設置  安全  技術
程序開發  語言  移動  數據  開源  百科
安全防護  資訊  黑客  木馬  病毒  移動
站長技術  搜索  SEO  推廣  媒體  移動
財經百科  股票  知識  理財  財務  金融
教育考試  育兒  小學  高考  考研  留學
您當前的位置:首頁 > IT百科 > 程序開發 > 語言 > C/C++/C#

c++之流媒體傳輸--Live555源碼解讀

時間:2019-11-22 11:53:54  來源:  作者:

Live555是一個為流媒體提供解決方案的跨平臺的C++開源項目,它實現了對標準流媒體傳輸是一個為流媒體提供解決方案的跨平臺的C++開源項目,它實現了對標準流媒體傳輸協議如RTP/RTCP、RTSP、SIP等的支持。Live555實現了對多種音視頻編碼格式的音視頻數據的流化、接收和處理等支持,包括MPEG、H.263+、DV、JPEG視頻和多種音頻編碼

關注+私信免費領取一份99的視頻學習資料哦

c++之流媒體傳輸--Live555源碼解讀

 

流媒體服務器搭建

框架:

Live555獲取網絡相機流?ffmpeg對獲取網絡相機碼流轉碼?視頻碼流的高效顯示

1

一、 live555、ffmpeg及D3D的簡介

Live555是一個標準流媒體傳輸的跨平臺C++開源項目。

Ffmpeg是一個音視頻解碼的開源項目。

DerictX9是微軟的游戲引擎庫。

二、 搭建開發環境

a) Live555的源碼編譯及環境配置

b) Ffmpeg的SDK獲取

c) D3D9的SDK獲取

三、 框架搭建

a) Live555獲取相機碼流的方法

a.1 支持rtsp相機的流URL地址

海康相機含賬戶密碼的url地址格式:

Rtsp://用戶名:密碼@碼流地址

主碼流:rtsp://admin:[email protected]/MPEG-4/ch2/main/av_stream

子碼流:rtsp://admin:[email protected]/MPEG-4/ch2/main/av_stream

a.2 live555獲取rtsp流

Live555 提供了一個簡單的客戶端工程,testRTSPClient。Live55獲取流的過程:打開URL進入工作調度循環,當連接失敗時會調用shutdownStream斷開流,并執行清理工作。只有當eventLoopWatchVariable為非零時才會停止工作調度循環。需要注意的是live555支持子會話,只有當所有子會話都停止時,才會將eventLoopWatchVariable設置為非零值,退出工作調度循環。參考testRTSPClient的shutdownStream函數。

// All subsequent activity takes place within the event loop:

env->taskScheduler().doEventLoop(&eventLoopWatchVariable);

// This function call does not return, unless, at some point in time, “eventLoopWatchVariable” gets set to something non-zero.

Live555工程有一個mediaServer工程,我們可以用它來測試我們的rtsp客戶端程序,此外也有一些公開的rtsp測試地址可用,比如

rtsp://218.204.223.237:554/live/1/67A7572844E51A64/f68g2mj7wjua3la7.sdp。還有一個比較好用的播放工具 VLC ,通過配置可以播放h.264的網絡視頻流。

b) Ffmpeg對獲取到H.264碼流的解碼方法

Ffmpeg的工作方式類似于插件的工作方式,解碼流程:

Ffmpeg初始化化?Ffmpeg解碼?Ffmpeg退出清理資源

b.1、Ffmpeg初始化內容

 

c++之流媒體傳輸--Live555源碼解讀

 

b.2、解碼函數

c++之流媒體傳輸--Live555源碼解讀

 

 

c++之流媒體傳輸--Live555源碼解讀

 


c++之流媒體傳輸--Live555源碼解讀

 

c) D3D9 YV12圖像渲染方法 
c.1 初始化D3D設備,渲染視頻

c++之流媒體傳輸--Live555源碼解讀

 


c++之流媒體傳輸--Live555源碼解讀

 


c++之流媒體傳輸--Live555源碼解讀

 


c++之流媒體傳輸--Live555源碼解讀

 


c++之流媒體傳輸--Live555源碼解讀

 

c.4設備丟失問題及解決辦法

c.4.1設備丟失

Direct3D設備要么處于可操作狀態,要么處于丟失狀態,可操作狀態即正常狀態,設備按預期運行并渲染。當某些事件發生時,設備將轉入丟失狀態,比如在全屏狀態下失去鍵盤焦點,這將導致無法繼續渲染。設備丟失的一個特點是所有的渲染操作都會silent failure,這就意味著即使渲染操作失敗了,渲染函數也能正確返回。在這種情況下,函數Present將返回D3DERR_DEVICELOST。

c.4.2解決辦法

c++之流媒體傳輸--Live555源碼解讀

 


c++之流媒體傳輸--Live555源碼解讀

 

d) 將三個技術組合搭建組合流媒體服務器,主要是數據的異步處理,三個技術的銜接

三個關鍵技術實現后,我們便可以根據工作所需組合起來實現需求。

Live555獲取到流后加入緩沖隊列,FFmpeg從緩沖隊列中取出數據解碼之后便可用D3d渲染播放,很明顯,在對這個緩沖隊列操作時,要使用使用鎖機制操作。這其中有兩個關鍵點。其一,視頻緩沖隊列要有限制,不能過大,超出一個最大值之后,就要對緩沖清理。其二D3d9的渲染速率跟live555網絡流的獲取速率不一致,渲染速率大于獲取速率,就會造成視頻卡頓。最簡單的一個辦法就是,按照獲取速率控制渲染,即以一幀為單位渲染,緩沖中小于一幀是,就不再渲染,并讓出cpu視頻,Sleep一段時間。這兩點總結為我們要對緩沖隊列里的緩沖幀數設置一個合理的范圍。

四、 優缺點

a) 性能:

i. 使用GPU解碼渲染視屏,大大降低CPU的使用率。

ii. 普通pc能夠播放視頻的路數。Intel Xeon E3-1220 3.1GHz cpu,NVIDIA NVS300 gpu播放視頻時每路大于占5%左右的cpu。

b) 易用性:使用的三個組件資料比較豐富,只要通過簡單的組合即可開發出網絡相機播放程序。

c) 穩定性:使用的三個組件,經過了長時間的檢驗,相當穩定,只要我們合理組合使用,便可開發出較為穩定的視頻程序。

五、 待改進的地方

a) 對流的有效控制。

b) 所依賴的三個SDK功能強大,但只用到了部分功能,因此對live555、ffmpeg源碼的裁剪精小,使其更適合此流媒體服務器。

c) D3D9僅能在windows平臺使用,需要使用跨平臺視頻渲染引擎,如OpenGl,或者使用并行計算的方式,如OpenCl。均是跨平臺,又是使用GPU解碼渲染,大大減輕CPU的負擔。

d) Ffmpeg是在cpu上解碼的,如果能夠通過并行計算(如OpenCl)的方式交由GPU解碼,將能進一步減少CPU的壓力,提升系統的流暢度。

e) 如果僅僅是播放網絡相機的rtsp流,我們可以使用VLC的SDK實現程序的快速開發。

六、參考資料免費獲取方法 關注+私信免費領取一份99的視頻學習資料哦

[1] live555源碼獲取及編譯

[2]ffmpeg開發庫獲取

[3]ffmpeg解碼h264

[4]yuv播放幾種方案(sdl、d3d、opengGl)

[5]使用VLC快速開發視頻流播放程序

[6]多路RTSP播放器直播與點播技術實現

C++ 高級語法學習

C++11增加了許多的特性,auto就是一個很明顯的例子。 還有就是typedid()獲取數據變量的類型

看下面簡短的代碼:

atuo: 很像JAVA中的加強for循環....。

c++之流媒體傳輸--Live555源碼解讀

 

關于C++關于款字符的使用:

c++之流媒體傳輸--Live555源碼解讀

 

關于數組類型的使用:

c++之流媒體傳輸--Live555源碼解讀

 

對于這里,我們需要知道的是,array的建立實在棧的基礎上,所以最大尺寸不要大于1M ,不然會出現棧溢出。

而對于vector而言,是建立在堆上的,所以沒有溢出的說法。

4, C++新特性,lambda表達式(匿名函數)

c++之流媒體傳輸--Live555源碼解讀

 

上面的實例,做的就是一個一個從1~5的累加過程。采用迭代器實現lambda函數。

5. 函數包裝器管理內嵌函數:

對于這一個C++高級語法的作用:

第一: 可以用作設計執行接口,接口設計關卡,也可以用來計數。

第二: 可以內嵌到另一個函數,實現函數的內嵌。游戲開發中,經常使用到這種方法。

c++之流媒體傳輸--Live555源碼解讀

 


c++之流媒體傳輸--Live555源碼解讀

 

運行結果如圖:

c++之流媒體傳輸--Live555源碼解讀

 

當然對于函數包裝器而言,還是可以調用外部函數的。不然怎么彰顯它的高級二字。

代碼:

 

c++之流媒體傳輸--Live555源碼解讀

 


c++之流媒體傳輸--Live555源碼解讀

 


c++之流媒體傳輸--Live555源碼解讀

 

編程是一種快樂,享受代碼帶給我的樂趣!!!



Tags:c++   點擊:()  評論:()
聲明:本站部分內容來自互聯網,內容觀點僅代表作者本人,如有任何版權侵犯請與我們聯系,我們將立即刪除。
▌相關評論
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
▌相關推薦
本地環境設置如果您想要設置 C++ 語言環境,您需要確保電腦上有以下兩款可用的軟件,文本編輯器和 C++ 編譯器。文本編輯器這將用于輸入您的程序。文本編輯器包括 Windows Notep...【詳細內容】
2019-11-26   c++  點擊:(2)  評論:(0)  加入收藏
Live555是一個為流媒體提供解決方案的跨平臺的C++開源項目,它實現了對標準流媒體傳輸是一個為流媒體提供解決方案的跨平臺的C++開源項目,它實現了對標準流媒體傳輸協議如RTP/R...【詳細內容】
2019-11-22   c++  點擊:(6)  評論:(0)  加入收藏
背景和問題 RAII RAII是 Resource acquisition is initialization 的簡稱,是面向對象編程中常用的一種模式。總結起來,RAII包括:1把資源的使用和維護封裝在類( class )中 在構...【詳細內容】
2019-11-21   c++  點擊:(7)  評論:(0)  加入收藏
在 C++ 中,除了可以創建各種函數,還包含了各種有用的函數供您使用。這些函數寫在標準 C 和 C++ 庫中,叫做內置函數。您可以在程序中引用這些函數。數學函數C++ 內置了豐富的數...【詳細內容】
2019-11-11   c++  點擊:(7)  評論:(0)  加入收藏
在章節《企業對C/C++程序員的技能要求》中,我們已經了解到企業需要的C程序員至少有70%以上是基于Linux開發的環境,基于Windows開發環境的職位實在太少。Windows多容易,多么的好...【詳細內容】
2019-11-08   c++  點擊:(12)  評論:(0)  加入收藏
問題描述:在部分背包問題中,可以不必拿走整個一件物品,而是可以拿走該物品的任意部分。以此求得在限定背包總重量,從給定的物品中進行選擇的情況下的最佳(總價值最高)的選擇方案...【詳細內容】
2019-11-07   c++  點擊:(29)  評論:(0)  加入收藏
使用c++有些年頭了,有一本深度搜索c++對象模型的書寫的很贊,很經典。本文是本書的讀書筆記。關于對象加上封裝后的布局成本c語言中如下聲明一個結構體typedef struct point3d{...【詳細內容】
2019-11-07   c++  點擊:(10)  評論:(0)  加入收藏
首先切記,指針一定要初始化,這是一個很必要的習慣!!!c++ 指針取值,一般為以下三種情景:1. 保存一個特定的對象地址2. 用另一個指針對其進行賦值3. 用0值,注意別的值是不行的接下來...【詳細內容】
2019-10-21   c++  點擊:(10)  評論:(0)  加入收藏
TCP/IP 協議棧是一系列網絡協議的總和,是構成網絡通信的核心骨架,它定義了電子設備如何連入因特網,以及數據如何在它們之間進行傳輸。TCP/IP 協議采用4層結構,分別是應用層、傳...【詳細內容】
2019-10-21   c++  點擊:(12)  評論:(0)  加入收藏
簡要介紹編寫C/C ++應用程序的領域,標準庫的作用以及它是如何在各種操作系統中實現的。我已經接觸C++一段時間了,一開始就讓我感到疑惑的是其內部結構:我所使用的內核函數和類...【詳細內容】
2019-10-12   c++  點擊:(19)  評論:(0)  加入收藏
譯者注:可能很多程序員對C++已經非常熟悉,但是對命名空間經常使用到的地方還不是很明白,這篇文章就針對命名空間這一塊做了一個敘述。命名空間在1995年被引入到 c++ 標準中,通常...【詳細內容】
2019-10-09   c++  點擊:(18)  評論:(0)  加入收藏
字符串截取我想每個程序猿不管是新手還是老手都很熟悉了,像C++里的substr()方法就十分好用,但是這個方法需要知道你要截取位置的起始位置和需要截取的字符串長度,又或者需要知道...【詳細內容】
2019-10-09   c++  點擊:(12)  評論:(0)  加入收藏
參考中文版谷歌開源項目風格指南,但是并不與其完全相同,整理出來便于規范自己的編碼風格。一、命名規范1、文件命名 文件名全部小寫,如果項目沒有命名約定則用下劃線"_"分隔開 ...【詳細內容】
2019-10-08   c++  點擊:(46)  評論:(0)  加入收藏
C++11 中推出了三種智能指針,unique_ptr、shared_ptr 和 weak_ptr,同時也將 auto_ptr 置為廢棄(deprecated)。但是在實際的使用過程中,很多人都會有這樣的問題: 不知道三種智能...【詳細內容】
2019-10-08   c++  點擊:(37)  評論:(0)  加入收藏
goto 語句 無條件轉移控制流。當使用其他語句不可能將控制轉移到所需位置時使用。 語法屬性(可選) goto 標號 ;C++解釋goto 語句將控制轉移到標號所指定的位置。goto 語句...【詳細內容】
2019-09-29   c++  點擊:(22)  評論:(0)  加入收藏
我們繼續向下做個類比。既然C總要經過匯編一層,那為什么有人用C而不是直接用匯編呢? 先用匯編函數調用為例子。一個C函數的調用,在C語言里就是一行搞定,指定函數名,傳入實參列表,...【詳細內容】
2019-09-26   c++  點擊:(22)  評論:(0)  加入收藏
遞歸算法三:漢諾塔問題描述 移動規則:每次只能移動一個圓盤;圓盤可以插在A、 B和C中的任何一個塔座上;任何時刻都不能將一個較大的圓盤壓在較小的圓盤之上。分析邊界條件只有一...【詳細內容】
2019-09-26   c++  點擊:(16)  評論:(0)  加入收藏
不同的數據在計算機內存中的存儲方式不同,導致了“類型”這一抽象概念的出現。...【詳細內容】
2019-09-24   c++  點擊:(11)  評論:(0)  加入收藏
簡要介紹編寫C/C ++應用程序的領域,標準庫的作用以及它是如何在各種操作系統中實現的。我已經接觸C++一段時間了,一開始就讓我感到疑惑的是其內部結構:我所使用的內核函數和類...【詳細內容】
2019-09-24   c++  點擊:(29)  評論:(0)  加入收藏
C++ 允許在同一作用域中的某個函數和運算符指定多個定義,分別稱為函數重載和運算符重載。重載聲明是指一個與之前已經在該作用域內聲明過的函數或方法具有相同名稱的聲明,但是...【詳細內容】
2019-09-16   c++  點擊:(26)  評論:(0)  加入收藏
最新更新
欄目熱門
欄目頭條
31选7开奖11185