直播數據和索引
對于直播來說,所有的數據都是實時數據。如果要觀看歷史數據,則需要把實時的數據以當前時間作為索引記錄下來。回看的時候根據時間參數在索引中找到對應的數據進行播放。
直播流的錄制通常使用切片的方式,可以直接復用hls協議來進行錄制。hls協議在直播時,已經將直播流切成分段的ts片,只需將每個切片的時間索引記錄下來,在回放時播放該片就可以實現功能。
切片的間隔越大,單片的時間跨度就大,索引的精度就下降。切片間隔短,又會帶來切片文件數量多,維護成本高的問題。直播時單個ts片通常在幾秒的時間一片,過長的時間會引入播放時延。影響體驗。但對于錄制文件來說,如果3秒一片,每小時就會有1200片,每天產生近3萬個文件,對存儲的壓力會增大。因此可以采用大文件存儲,即多個片合并為一個文件,比如30秒一個文件,就把文件數量減少了10倍,然后通過range方式指定文件的偏移量獲取對應的文件。
文件和索引的存儲
文件的存儲是典型的對象存儲方式,一個文件對應一個存儲地址就可以了。
索引因為需要查找,可以采用數據庫方式,獲取的時候通過數據庫的查找可以方便的獲取到對應的數據片信息。
另一種方案是把索引也記錄成文件,好處是索引和數據文件可以同時使用存儲的過期規則,不用單獨維護。索引文件本身也按時間來做分割,取索引時先定位到哪個文件,然后再從文件中定位到具體的ts片。
索引格式示例:
索引包含每個ts片的時間戳TIME,片名TS,偏移量RANGE(如果有合并文件),文件存放路徑PATH,序列號SEQUENCE,播放時長EXTINF
{"TIME": 1672963200.769, "TS": "out_1672855446_1_26937.ts", "RANGE":"15454@0","PATH": "//live-timeshift.xstore.daliqc.cn/pull.test.com/live/", "SEQUENCE": 26937, "EXTINF": 2.0}
{"TIME": 1672963202.769, "TS": "out_1672855446_1_26937.ts", "RANGE":"15453@15454","PATH": "//live-timeshift.xstore.daliqc.cn/pull.test.com/live/", "SEQUENCE": 26938, "EXTINF": 2.0}
{"TIME": 1672963204.761, "TS": "out_1672855446_1_26938.ts", "PATH": "//record.ctyunxs.cn/timeshift/stage/stream-111372623411151520/", "SEQUENCE": 26939, "EXTINF": 4.0, "PARAM": ""}
直播回放
回放時通過客戶請求的時間參數,根據索引文件中的TIME值,查找到對應的播放文件名和存儲地址,返回給客戶端進行播放。