一、本地:採用javaCV(安卓和java平臺推薦javaCV)、ffmpeg、openCV或者jmf能夠很方便的獲取到本地攝像頭流媒體html
javaCV系列文章:html5
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更快的攝像頭讀取速度和效率,方便讀取後的圖像處理)
二、監控(第三方攝像頭):經過設備sdk或者rtsp直播流獲取流媒體源
直播:經過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推流、拉流
目前主流的流媒體服務器有: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
直播:經過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滿負荷運行進行資源回收,會嚴重佔用系統資源,致使系統運行遲滯,影響系統運行性能和實時性等等。