實時監控、直播流、流媒體、視頻網站開發方案設計簡要

  • 歡迎你們積極開心的加入討論羣

羣號:371249677 (點擊這裏進羣)

1、本地推送端

一、本地:採用javaCV(安卓和java平臺推薦javaCV)、ffmpeg、openCV或者jmf能夠很方便的獲取到本地攝像頭流媒體html

javaCV系列文章:html5

javacv開發詳解之1:調用本機攝像頭視頻java

javaCV開發詳解之2:推流器實現,推本地攝像頭視頻到流媒體服務器以及攝像頭錄製視頻功能實現(基於javaCV-FFMPEG、javaCV-openCV)nginx

javaCV開發詳解之3:收流器實現,錄製流媒體服務器的rtsp/rtmp視頻文件(基於javaCV-FFMPEG)web

javaCV開發詳解之4:轉流器實現(也可做爲本地收流器、推流器,新增添加圖片及文字水印,視頻圖像幀保存),實現rtsp/rtmp/本地文件轉發到rtmp流媒體服務器(基於javaCV-FFMPEG)服務器

javaCV開發詳解之5:錄製音頻(錄製麥克風)到本地文件/流媒體服務器(基於javax.sound、javaCV-FFMPEG)多線程

javaCV開發詳解之6:本地音頻(話筒設備)和視頻(攝像頭)抓取、混合並推送(錄製)到服務器(本地)併發

javaCV開發詳解之7:讓音頻轉換更加簡單,實現通用音頻編碼格式轉換、重採樣等音頻參數的轉換功能(以pcm16le編碼的wav轉mp3爲例)框架

補充篇:tcp

音視頻編解碼問題:javaCV如何快速進行音頻預處理和解複用編解碼(基於javaCV-FFMPEG)

音視頻編解碼問題:16/24/32位位音頻byte[]轉換爲小端序short[],int[],以byte[]轉short[]爲例

實現給圖片增長圖片水印或者文字水印(也支持視頻圖像幀添加水印)

javacpp-ffmpeg系列:

javacpp-FFmpeg系列之1:視頻拉流解碼成YUVJ420P,並保存爲jpg圖片

javacpp-FFmpeg系列之2:通用拉流解碼器,支持視頻拉流解碼並轉換爲YUV、BGR24或RGB24等圖像像素數據

javacpp-FFmpeg系列之3: 圖像數據轉換(BGR與BufferdImage互轉,RGB與BufferdImage互轉)

javaCV圖像處理系列:

1、javaCV圖像處理之1:實時視頻添加文字水印並截取視頻圖像保存成圖片,實現文字水印的字體、位置、大小、粗度、翻轉、平滑等操做

2、javaCV圖像處理之2:實時視頻添加圖片水印,實現不一樣大小圖片疊加,圖像透明度控制

3、opencv圖像處理3:使用opencv原生方法遍歷攝像頭設備及調用(方便多攝像頭遍歷及調用,相比javacv更快的攝像頭讀取速度和效率,方便讀取後的圖像處理)

4、opencv圖像處理系列:國內車輛牌照檢測識別系統(萬份測試準確率99.7%以上)

二、監控(第三方攝像頭):經過設備sdk或者rtsp直播流獲取流媒體源

2、轉流端

直播:經過ffmpeg(推薦),live555將接收rtsp或者字節碼流並轉爲flv格式發佈到rtmp流媒體服務器(流媒體服務器必須先建好)

hls原理同上

注意:rtmp只支持flv格式封裝的視頻流

ffmpeg服務實現方式實例請參考:

http://blog.csdn.net/eguid_1/article/details/51777716

http://blog.csdn.net/eguid_1/article/details/51787646

也能夠參考javaCV的轉流器實現:javaCV開發詳解之4:轉流器實現,實現rtsp/rtmp/本地文件轉發到rtmp服務器  

java封裝FFmpeg命令,支持原生ffmpeg所有命令,實現FFmpeg多進程處理與多線程輸出控制(開啓、關閉、查詢),rtsp/rtmp推流、拉流

3、流媒體服務器

目前主流的流媒體服務器有:fms,nginx-rtmp,red5(java),flazr

本地視頻:直接經過流媒體服務器解碼並推送視頻流

直播流:經過開啓udp/rtp/rtsp/rtmp/hls等等流媒體服務,從ffmpeg/live555獲取推送過來的實時視頻流併發布到rtmp/hls直播流並推送(能夠邊直播邊保存)

rtmp和hls這兩種是web領域主流的流媒體協議。使用rtp或rtsp協議的通常都是監控。

流媒體協議選擇:rtmp基於tcp協議,rtmp可以保持3秒左右延遲。hls是基於http協議,因此實時性特別差,想要用hls保持實時性的就別想了,hls延遲基本超過10秒。

實時性要求特高的,建議使用基於udp協議的一些流媒體協議。

基於tcp和udp兩種流媒體協議區別就是tcp會強制同步,udp是數據發出去就無論了。

因此最終的方案就是:強同步可是實時性要求不高用基於tcp協議的,強實時性弱同步就udp。

補充:nginx-rtmp流媒體服務器搭建實例:http://blog.csdn.net/eguid_1/article/details/51749830

nginx-rtmp配置指令詳細含義和用法:http://blog.csdn.net/eguid_1/article/details/51821297

4、播放端(收流端)

直播:經過flex(flash)播放器或者第三方播放器(videoJS,ckplayer,VideoLAN 等...)調用流媒體服務器的流媒體源解碼並播放,若是不須要兼容低版本IE,能夠採用HTML5的webSocket播放器,videoJS是flash/html5雙核播放器。

 

視頻:經過html自帶播放器、flex(flash)播放器或者第三方播放器(videoJS,ckplayer,VideoLAN 等...)進行播放

videoJS/ckplayer播放器二次開發支持rtmp直播、hls直播及普通視頻播放:http://blog.csdn.net/eguid_1/article/details/51898912

 

通常使用videoLAN播放器做爲測試工具,用於測試音視頻流發佈情況

補充:

一、若是是採用nginx服務器,它提供的rtmp模塊能夠發佈rtmp直播、錄播及hls,nginx能夠把ffmpeg整合進去方流媒體後期處理(加水印等)。

二、java是能夠調用ffmpeg的,經過jni的方式有兩種方法:

2.一、javaCV1.2支持經過javacpp調用ffmpeg,javaCV目前整合了8種流媒體處理框架,是安卓和javaEE平臺不可或缺的強大流媒體處理利器 

2.二、javaAV(目前最新0.7,release最新0.5)提供了對java調用ffmpeg的支持,當前已中止更新

 

補充:爲何沒有基於原生java(或者說自帶GC的語言)的流媒體框架,緣由來自GC,也就是java引覺得豪的自動垃圾回收機制(真的是成也蕭何,敗也蕭何)

爲何呢?

你們知道,直播(顧名思義,實時視頻轉發),這種實時性項目會產生大量的對象,這樣會致使兩種狀況:

一、產生大量對象後佔據的內存資源得不到及時釋放,因而虛擬機內存溢出。

二、產生大量對象致使GC滿負荷運行進行資源回收,會嚴重佔用系統資源,致使系統運行遲滯,影響系統運行性能和實時性等等。

相關文章
相關標籤/搜索