最近因爲項目上須要一個攝像頭在線預覽的功能,因而便琢磨了一個小玩意出來分享分享。項目是在win上,合做的人懂js,基於這樣的狀況,我只選擇nodejs做爲開發。並未使用php相關。php
一開始作這個,我並不感到陌生,由於我之前使用過開源的解碼器FFmpeg,因此我知道使用它就能夠實現攝像頭的rtsp流轉hls,只要轉成hls了,我就可使用開源的video-js-control-hls來播放m3u8文件了,並且我司用了海康的軟件產品,它們就是開放接口,經過請求接口獲取在線播放文件。思路是很清晰的,那我有了這樣的思路,並開始在npmjs.com裏面找輪子 node
通過一番的查找,最後我選定了幾個輪子。首先是fluent-ffmpeg這個操做ffmpeg的中間件,而後就是hls-server這個http服務,它過濾全部和hls沒法的資源,只保留.m3u8和.ts資源。那這樣的話,輪子有了,那下面就是去熟悉一下理論知識(音視頻轉碼、ffmpeg等)c++
瀏覽了大概的理論知識後,那再接着就是細節的優化了。細節問題我在作以前發了一個思否的提問(連接:作一個海康攝像頭轉hls而後使用h5方式播放的細節問題),心寒的是,平名沒法被人看到,知識就是力量,力量不夠就有問題,因此我開始本身的琢磨(基本上那幾天晚上都在想)。 git
琢磨了幾天後,我找到了幾個關鍵點:npm
何時開始轉碼(服務啓動就轉碼仍是接口發送後收到轉碼通知在轉碼)segmentfault
固然是接口發送後收到轉碼通知在轉碼api
何時沒人看了,關閉轉碼服務,清理播放文件緩存
用戶觀看的時間做爲更新時間,服務端創建一個心跳檢測,當超過設置時間沒人看,就治理ffmpeg進程和播放文件服務器
若是生成的播放文件,一直沒人看,那也要關閉轉碼服務,清理播放文件tcp
記錄播放文件觀看的時間,若是有人看,就更新這個時間,服務端創建一個心跳檢測,當超這個時間超過過設置時間沒人看,就治理ffmpeg進程和播放文件
是否加入緩存
一開始沒加,每次請求都生成新的播放文件,後面考慮到咱們是應用層開發,不是c++這些,因此仍是加緩存,當關閉轉碼服務,清理播放文件的條件知足時,同時也清理緩存的url
當我完成了這個版本後,我發現不夠好,爲何不夠好呢,由於開始轉碼到生成播放文件,我在個人電腦和服務器上測試的平均時間是在11秒左右,最好的時候是3秒。咱們在保證服務器配置的同時應該在思考有沒有優化的空間。我這個版本就是api請求,而後使用fluent-ffmpeg的方法去建立ffmpeg進程,fluent-ffmpeg使用pipe向進程輸入命令。那我就想了,我可否預先的生成ffmpeg進程並讓它掛起(就是作ffmpeg進程池),而後api請求,我從進程池裏面拿一個出來用,當自動清理時,我再也不關閉進程,而是使用信號暫停進程。我想這樣的方式,應該會加快生成播放文件的時間,減小api等待的時間。
目前的話,我開始研究fluent-ffmpeg的源碼,感受從它這裏還沒找到方法,我因而本身操做了一個示例,我在啓動tcp後,使用
理論上是能夠的了,並且這樣建立的進程是掛起的,我後續在關鍵參數加管道,後面應該就能夠實現了吧,暫時在研究中,若是研究成功,我會發布第二版本。
最後,我附上一個git地址給你們吧,代碼寫的不咋樣,見笑了:hk-hls