天天看點

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

快速傳送至: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引以為豪的自動垃圾回收機制(真的是成也蕭何,敗也蕭何)

為什麼呢?

繼續閱讀