|
hls切片器用了两个srs实例,一个是live-srs,一个是hls-srs。 live实例负责接受推流,而hls实例则负责切片。这种框架会带来很大的灵活性。 在两个情况下,需要这两个srs进程间通信。 情况1:由外部传入session_id来动态决定hls的录像路径,也就是ts切片文件存放的子目录。 情况2:把流名称stream替换为另外一个随机数如uuid,从而隐藏原始的推流地址信息。 涉及进程间通信,用redis缓存来传递数据是比较合适的选择,不需要做持久化。 由于复制了2个子流,加上原始流,一共三个流,因此,live-srs在redis中一次性入三个k:v键值对。 {"stream":"session_id"},{"stream-sd":"session_id"},{"stream-lw":"session_id"} hls-srs实例在生成hlspath时,利用自己的获得的stream作为key直接从redis中取出value即session_id. 这里不使用app,因为看起来没有必要用到它,只使用stream就行了。 对于修改stream名称的情况,这也需要在Redis中存入键值对。假设原来stream修改为new_stream。 则键值对为:{"new_stream":"stream"},{"new_stream-sd":"stream"},{"new_stream-lw":"stream"} hls-srs实例用new_stream获得stream,再由stream获得session_id。 这有点点啰嗦。直接在生成new_stream时,再生成三组k:v存入redis。 {"new_stream":"session_id"},{"new_stream-sd":"session_id"},{"new_stream-lw":"session_id"} 这样就比较方便了,hls-srs实例不管是收到旧名称还是新名称,都可以顺利找到session_id。 如何知道现在流的new_stream呢? live-srs写入redis中: stream_url="dst-" + req->stream; redis_setex(stream_url.c_str(), req->dst_stream.c_str(),36000); hls-srs读出来就可以了。 修改名称会带来两个问题: 1. m3u8无法接续产生,不能继续前面的ts切片了,因为文件名都变了。 2. 转码流会造成困扰,内部的拉流不知道是从local_pool去取source还是pool去取source。 |