直播数据和索引
对于直播来说,所有的数据都是实时数据。如果要观看历史数据,则需要把实时的数据以当前时间作为索引记录下来。回看的时候根据时间参数在索引中找到对应的数据进行播放。
直播流的录制通常使用切片的方式,可以直接复用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": "http://live-timeshift.xstore.ctyun.cn/pull.test.com/live/", "SEQUENCE": 26937, "EXTINF": 2.0}
{"TIME": 1672963202.769, "TS": "out_1672855446_1_26937.ts", "RANGE":"15453@15454","PATH": "http://live-timeshift.xstore.ctyun.cn/pull.test.com/live/", "SEQUENCE": 26938, "EXTINF": 2.0}
{"TIME": 1672963204.761, "TS": "out_1672855446_1_26938.ts", "PATH": "http://record.ctyunxs.cn/timeshift/stage/stream-111372623411151520/", "SEQUENCE": 26939, "EXTINF": 4.0, "PARAM": ""}
直播回放
回放时通过客户请求的时间参数,根据索引文件中的TIME值,查找到对应的播放文件名和存储地址,返回给客户端进行播放。