轉載請註明出處:https://blog.csdn.net/impingo
項目地址:https://github.com/im-pingo/pingos
項目官網:http://pingos.io
直播時移原理
什麼是直播時移
所謂直播時移,是指在直播過程中可以任意回看過去的直播內容的技術。它是與直播和點播相結合的一種技術,在播放器端看來它和直播協議沒有區別。觀衆可以在當前時間點向前回溯到某個時間點開始一直觀看下去,直到視頻內容結束。
常用協議
http-flv協議
http-flv在直播場景下的應用
直播協議中的http-flv流程是,利用http的特性,如果http服務器返回頭裏沒有length參數,http客戶端則會一直保持接收數據的狀態。
服務器收到播放器發來的http get請求後馬上回復flv header + metadata + 音視頻數據,只要主播不停地向http flv服務器推流,服務器就能源源不斷地將實時數據發向客戶端。
http-flv在時移場景下的應用
上圖中直播服務器和時移服務器可以是同一個,我只是爲了說明問題將其在圖中分開描述。
hls協議
hls在直播場景下的應用
在直播場景下,ts文件在硬盤裏的數量是固定數量並且是實時更新的,客戶端通過http請求不停地下載最新的ts文件,以達到直播效果。
hls在時移場景下的應用
上圖中直播服務器和時移服務器可以是同一個,我只是爲了說明問題將其在圖中分開描述。
hls和http-flv時移原理相同
下面以http-flv時移流程爲例說明:
不管是http-flv還是hls最關鍵之處在於定位starttime對應的錄像文件位置。
存儲規則
爲了實現時移效果,存儲時除了錄像文件外還需要同時存儲一份索引文件,通過這份索引文件可以快速找到starttime對應的是哪一個文件中的什麼位置。
存儲路徑
錄像文件路徑規則:
媒體文件存放路徑:serverid/application/date/stream_timestamp.ts
索引文件存放路徑:serverid/application/index/date/stream_timestamp.m3u8
截圖中serverid:000,application:live,stream:00,date:20191127
索引文件內容規則:
索引文件的作用是將時間映射成媒體文件中I幀的位置,因爲播放器必須要先獲取到關鍵幀才能開始解碼播放,所以時移開始的位置一定要偏移到距離指定起始時間最近的關鍵幀位置。換句話說關鍵幀間隔直接影響了時移的精度。
首先需要明確的是每個媒體文件都對應有一個索引文件,爲了方便索引,整數個GOP(可以簡單理解爲整數個I幀)在索引文件中生成一條記錄。
每條記錄的組成規則如下:
媒體文件名?startsize=xxx&endsize=xxx&starttime=xxx&endtime=xxx
starttime:這條索引記錄對應的媒體文件中第一個I幀的時間戳
endtime:這條索引記錄對應的媒體文件中最後一個I幀的時間戳
startsize:starttime這個時間點的I幀(第一個I幀)在媒體文件中的偏移量
endsize:endtime對應的I幀(也就是最後一個I幀)在媒體文件中的偏移量
時移請求中一定會帶有starttime參數,通過以下索引步驟就可以準確找到指定時間點的文件位置:
- 首先,通過路徑規則定位到某一天的錄像
- 然後,索引某一天裏所有索引文件名,進而定位到客戶端想要觀看的內容在具體哪個媒體文件裏
- 最後,通過讀取索引文件裏的索引記錄定位到具體媒體文件中的關鍵幀位置,有了關鍵幀位置就可以從這個位置開始下發flv內容或者生成m3u8文件,進而實現時移功能。
總結
時移功能的核心之處在於一步步定位到某一時間點所在媒體文件中的位置,只要能夠達到這點要求就都能實現你想要的時移服務,具體下發時候是使用http-flv還是hls或者dash甚至是webrtc都不是問題。
QQ交流羣:697773082
QQ交流羣:697773082