歡迎大家積極開心的加入討論群
群號:371249677 (點擊這裡進群)
一、本地推送端 1、本地:採用javaCV(安卓和java平台推薦javaCV)、ffmpeg、openCV或者jmf可以很方便的擷取到本地網路攝影機流媒體
javaCV系列文章:
javacv開發詳解之1:調用本機網路攝影機視頻
javaCV開發詳解之2:推流器實現,推本地網路攝影機視頻到流媒體伺服器以及網路攝影機錄製視頻功能實現(基於javaCV-FFMPEG、javaCV-openCV)
javaCV開發詳解之3:收流器實現,錄製流媒體伺服器的rtsp/rtmp視頻檔案(基於javaCV-FFMPEG)
javaCV開發詳解之4:轉流器實現(也可作為本地收流器、推流器,新增添加圖片及文字浮水印,視頻映像幀儲存),實現rtsp/rtmp/本地檔案轉寄到rtmp流媒體伺服器(基於javaCV-FFMPEG)
javaCV開發詳解之5:錄製音頻(錄製麥克風)到本地檔案/流媒體伺服器(基於javax.sound、javaCV-FFMPEG)
javaCV開發詳解之6:本地音頻(話筒裝置)和視頻(網路攝影機)抓取、混合并推送(錄製)到伺服器(本地)
javaCV開發詳解之7:讓音頻轉換更加簡單,實現通用音頻編碼格式轉換、重採樣等音頻參數的轉換功能(以pcm16le編碼的wav轉mp3為例)
補充篇:
音視頻編解碼問題:javaCV如何快速進行音頻預先處理和解複用編解碼(基於javaCV-FFMPEG)
音視頻編解碼問題:16/24/32位位音頻byte[]轉換為小端序short[],int[],以byte[]轉short[]為例
實現給圖片增加圖片浮水印或者文字浮水印(也可使用視訊映像幀添加浮水印)
2、監控(第三方網路攝影機):通過裝置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 nginx-rtmp配置指令詳細含義和用法:http://blog.csdn.net/eguid_1/article/details/51821297 四、播放端(收流端) 直播:通過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播放器作為測試載入器,用於測試音視頻流發布狀況 補充: 1、如果是採用nginx伺服器,它提供的rtmp模組發行就緒rtmp直播、錄播及hls,nginx可以把ffmpeg整合進去方流媒體後期處理(加浮水印等)。 2、java是可以調用ffmpeg的,通過jni的方式有兩種方法: 2.1、javaCV1.2支援通過javacpp調用ffmpeg,javaCV目前整合了8種流ApsaraVideo for Media Processing架構,是安卓和javaEE平台不可或缺的強大流ApsaraVideo for Media Processing利器 2.2、javaAV(目前最新0.7,release最新0.5)提供了對java調用ffmpeg的支援,當前已停止更新
補充:為什麼沒有基於原生java(或者說內建GC的語言)的流媒體架構,原因來自GC,也就是java引以為豪的自動記憶體回收機制(真的是成也蕭何,敗也蕭何) 為什麼呢。 大家知道,直播(顧名思義,即時視頻轉寄),這種即時性項目會產生大量的對象,這樣會導致兩種情況: 1、產生大量對象後佔據的記憶體資源得不到及時釋放,於是虛擬機器記憶體溢出。 2、產生大量對象導致GC滿負荷運行進行資源回收,會嚴重佔用系統資源,導致系統運行遲滯,影響系統運行效能和即時性等等。