需求
問題:有沒有flash播放RTSP的播放器?H5能不能支持RTSP播放?
答案:沒見過,以后估計也不會有;
問題:可以自己做瀏覽器插件播放RTSP嗎?
答案:可以的,chrome做ppapi插件,IE用ocx插件;
但是,兼容性太差了,開發成本過高。在PC web兼容性上面,目前最好的方案是flash或者H5,但是H5在IE比較低版本上面會存在不支持的問題,還是需要前端兼容切換成flash模式;在手機 web/微信兼容上面,毫無疑問,H5是唯一選擇;
方案
那么問題來了,如何能夠實現需求中的兩點:
- PC上輸出兼容性較強的flash需要的rtmp或者hls流或者http-flv流;
- 手機上輸出H5標准的HLS(m3u8+ts)流;
其實目前市面上大部分的CDN方案已經提示了我們如何解決上述的問題了,那就是采用rtmp推流到rtmp流媒體服務器,同步輸出:rtmp/hls/http-flv多種碼流,再通過前端的兼容適配,就能完美地達到想要的方案,總結來說,需要通過幾個步驟:
- RTSP拉流;
- 音視頻轉碼(H.264 + AAC);
- RTMP推流;
- RTMP流媒體服務器;
- 前端兼容取流播放;
實現方法
1. RTSP拉流
目前市面上能非常兼容地拉取各個廠家的RTSP流的方案總結來說有兩種:
- live555
- ffmpeg
兩種都能比較不錯地請求獲取到各個廠家的攝像機碼流,但從可操作的靈活角度上來說,live555更勝一籌,比如:我們遇到雄邁的某款攝像機需要在RTSP拉流的過程中,向攝像機定期發送OPTIONS保活報文,而我們遇到的某款海康的NVR在RTP over tcp取流的過程中,一旦發送RTSP的任何報文,就會出現服務器端主動reset,種種此類,如果基於ffmpeg的拉流確實是可以兼容大部分的攝像機IPC、NVR,但是遇到特殊種類的就比較難進行改造和兼容了;
沒有絕對,根據需求,也許您就只需要接入某兩款特定類型的攝像機呢,怎么適合現場需求怎么來;
2. 音視頻轉碼(H.264 + AAC)
由於目前RTMP、HLS的協議標准,包括前端的支持上,還停留在H.264+AAC的組合上,所以,我們需要將各種視頻格式:H.265、MJPEG、MPEG4,各種音頻格式:G.711A/U、G.726,都統一轉碼成H.264和AAC,說到轉碼,那肯定是ffmpeg first;
目前市面上的大部分攝像機都是默認或者設定為輸出H.264視頻流,但音頻流轉碼就肯定是需要兼容的,目前來說安防標准中大部分的音頻格式都還是G.711和G.726居多,那就可以用faac、EasyAACEncoder(Based on faac)進行音頻轉碼了!
3. RTMP推流
RTMP推流毋庸置疑,目前最流行的還是librtmp了,當然直接用ffmpeg也直接集成了rtmp推流的功能,而且在時間戳調優方面,幫助我們省了很多事情;
關於時間戳調優上,我們在開發EasyRTMP上花費了很多時間,由於各個IPC廠家出來的時間戳不一定是非常標准的(這里就要贊一下海康,批評一下雄邁了,請問雄邁的開發,你們搞出來的時間戳都是什么玩意兒?),所以就需要RTMP推流端對時間戳進行一次均勻化,不然就會出現HLS經常會快放、慢放、卡頓緩沖加載的現象,這一點上EasyRTMP參考的ffmpeg的-re命令的方案,對時間戳進行了優化,保證均勻播放;
4. RTMP流媒體服務器
這里說到的RTMP服務器有幾個輸出條件:
- rtmp
- hls
- http-flv(可選)
這種類型的開源流媒體服務器目前可以推薦的有國產的srs、著名的nginx-rtmp、當然還有我們開發的商業化的EasyDSS(EasyDSS是EasyDarwin團隊開發的一款商用流媒體服務器,詳情見:www.easydss.com),除了nginx-rtmp不能輸出http-flv功能(當然也不會影響整體需求的實現),都能非常好地滿足用戶的需求;
5. 前端兼容取流播放
前端兼容當然就是一套非常閃亮而且先進的前端框架,能響應式地接受各種不同平台終端的請求,為PC web、手機 web、微信分配從rtmp流媒體服務器獲取rtmp、hls、http-flv等直播流;