快速傳送至:javacv入門指南:序章
快速傳送至:從零開始開發和搭建直播平台-教程彙總篇
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開發詳解之8:轉封裝在rtsp轉rtmp流中的應用(無須轉碼,更低的資源消耗,更好的性能,更低延遲)
javaCV開發詳解之9:基于gdigrab的windows螢幕畫面抓取/采集(基于javacv的螢幕截屏、錄屏功能)
javaCV開發詳解之10:基于dshow調用windows攝像頭視訊和音頻,想要擷取螢幕畫面首選gdigrab
補充篇:
javaCV開發詳解補充篇:基于avfoundation的蘋果Mac和ios擷取螢幕畫面及錄屏/截屏以及攝像頭畫面和音頻采樣擷取實作
音視訊編解碼問題:javaCV如何快速進行音頻預處理和解複用編解碼(基于javaCV-FFMPEG)
音視訊編解碼問題:16/24/32位位音頻byte[]轉換為小端序short[],int[],以byte[]轉short[]為例
實作給圖檔增加圖檔水印或者文字水印(也支援視訊圖像幀添加水印)
java原生實作螢幕裝置周遊和螢幕采集(捕獲)等功能
流媒體直播實時視訊延遲時間排查和剖析
javacv文字識别系列:
javaCV文字識别之1:基于google的tesserac ocr識别圖檔中的文字,跨平台支援英文中文簡體繁體等各種字元識别
javaCV文字識别之2:視訊文字識别和視訊提取字幕文字字元
javacpp-ffmpeg系列:
javacpp-FFmpeg系列之1:視訊拉流解碼成YUVJ420P,并儲存為jpg圖檔
javacpp-FFmpeg系列之2:通用拉流解碼器,支援視訊拉流解碼并轉換為YUV、BGR24或RGB24等圖像像素資料
javacpp-FFmpeg系列之3: 圖像資料轉換(BGR與BufferdImage互轉,RGB與BufferdImage互轉)
javacpp-FFmpeg系列補充:FFmpeg解決avformat_find_stream_info檢索時間過長問題
javacpp-opencv系列:
一、javaCV圖像處理之1:實時視訊添加文字水印并截取視訊圖像儲存成圖檔,實作文字水印的字型、位置、大小、粗度、翻轉、平滑等操作
二、javaCV圖像處理之2:實時視訊添加圖檔水印,實作不同大小圖檔疊加,圖像透明度控制
三、javacv圖像處理3:使用opencv原生方法周遊攝像頭裝置及調用(友善多攝像頭周遊及調用,相比javacv更快的攝像頭讀取速度和效率,友善讀取後的圖像處理)
四、javacv圖像處理系列:國内車輛牌照檢測識别系統(萬份測試準确率99.7%以上)
一、本地推送端
1、本地:采用javaCV(安卓和java平台推薦javaCV)、ffmpeg、openCV或者jmf可以很友善的擷取到本地(windows、macos、安卓、ios、linux或者其他裝置)攝像頭畫面或者視訊檔案以及其他流媒體。
以下幾篇是視訊源抓取/采集篇:
2、監控(第三方攝像頭):通過裝置sdk或者rtsp直播流擷取流媒體源
以下是以錄影機的rtsp位址為例(其中第4章是轉碼,第8章是轉封裝):
二、轉流端
直播:通過ffmpeg(推薦),live555将接收rtsp或者位元組碼流并轉為flv格式釋出到rtmp流媒體伺服器(流媒體伺服器必須先建好)
hls原理同上
注意:rtmp隻支援flv格式封裝的視訊流
ffmpeg服務實作方式執行個體
也可以參考javaCV的轉流器實作:javaCV開發詳解之4:轉流器實作,實作rtsp/rtmp/本地檔案轉發到rtmp伺服器
java封裝FFmpeg指令,支援原生ffmpeg全部指令,實作FFmpeg多程序處理與多線程輸出控制(開啟、關閉、查詢),rtsp/rtmp推流、拉流
轉封裝實作:
三、流媒體伺服器
目前主流的流媒體伺服器有:srs、nginx-rtmp(以及nginx其他流媒體插件)、fms、red5(java)、flazr
本地視訊:直接通過流媒體伺服器解碼并推送視訊流
直播流:通過開啟udp/rtp/rtsp/rtmp/hls等等流媒體服務,從ffmpeg/live555擷取推送過來的實時視訊流并釋出到rtmp/hls直播流并推送(可以邊直播邊儲存)
rtmp、flv這兩種是web領域主流的直播協定,flv和hls是主流點播協定;使用rtp或rtsp協定的一般都是區域網路監控裝置。
流媒體協定選擇:rtmp基于tcp協定,rtmp能夠保持1-3秒左右延遲,flv等同于rtmp。hls(m3u8)是基于http協定,實時性特别差(蘋果在設計這套協定的時候本來就不是用來作為直播流的,蘋果官方也是推薦hls作為點播協定),想要用hls保證明時性是很難的,雖然可以把每個ts切的很小,但是每個ts的請求解析也是要耗時的,還有切ts分片本身也耗時耗資源,而且對硬碟要求也很高,大量碎片檔案會讓硬碟吃不消)。
實時性要求特高的,建議使用基于udp協定的一些流媒體協定,比如國内幾家直播平台會自己定義一套udp私有協定流。
基于tcp和udp兩種流媒體協定差別就是tcp會強制同步,udp是資料發出去就不管了。
是以最終的方案就是:強同步但是實時性要求不高用基于tcp協定的,強實時性弱同步就udp。外網盡量不用rtsp,丢包率高的讓人瘆得慌,現在國内主流直播方案是:flv(首選)>rtmp>udp私有協定>hls,如果是點播則是hls>flv>mp4。
補充:nginx-rtmp流媒體伺服器搭建執行個體
nginx-rtmp配置指令詳細含義和用法
四、播放端(收流端)
直播:通過flex(flash)播放器或者第三方播放器(videoJS,ckplayer,VideoLAN 等...)調用流媒體伺服器的流媒體源解碼并播放,如果不需要相容低版本IE,可以采用HTML5的webSocket播放器,videoJS是flash/html5雙核播放器。
視訊:通過html自帶播放器、flex(flash)播放器或者第三方播放器(videoJS,ckplayer,VideoLAN 等...)進行播放
videoJS/ckplayer播放器二次開發支援rtmp直播、hls直播及普通視訊播放
一般使用videoLAN播放器作為測試工具,用于測試音視訊流釋出狀況
補充:
1、如果是采用nginx伺服器,它提供的rtmp子產品可以釋出rtmp直播、錄播及hls,nginx可以把ffmpeg整合進去方流媒體後期處理(加水印等)。
2、java是可以調用ffmpeg的,通過jni的方式有兩種方法:
2.1、javaCV一直在更新,作者是deeplearning4j的成員,JavaCV已經更新到了1.5x版本,支援通過javacpp調用ffmpeg,javaCV目前整合了幾十種流媒體處理架構,是跨平台的強大流媒體處理利器
2.2、javaAV(目前最新0.7,release最新0.5)提供了對java調用ffmpeg的支援,目前已停止更新
補充:為什麼沒有基于原生java(或者說自帶GC的語言)的流媒體架構,原因來自GC,也就是java引以為豪的自動垃圾回收機制(真的是成也蕭何,敗也蕭何)
為什麼呢?