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。
如何在srs的两个实例间传递数据
最新推荐文章于 2023-09-06 14:07:42 发布