Shared live media plane
Shared live media plane trong SRS
Sau kiến trúc OO thì ta xem business domain
-
Sau khi trace xong flow accept → connection → transport → state-threads → RTMP, trọng điểm tiếp theo ở mức kiến trúc mình thấy đáng học tiếp là “stream identity + shared live path”. Mình không quan tâm lắm tới data chunk vì protocol thì vừa nhiều vừa chi li quá, nào công việc phải đụng thì coi sau
-
Ở mức business domain rất đáng học thì nên là trace hiểu được một live flow dùng chung trong process.
Domain không chỉ là sơ đồ class
-
Tiếp cận ở khia cạnh domain đây không phải kiểu object như "has-a" mà mình hay dùng để coi cấu trúc OO. Thay vào đó cái mình muốn nắm được là trọng tâm mô hình nghiệp vụ: stream được định danh ra sao, ai tạo và giữ instance (SrsLiveSource thông qua manager), ai subscribe (consumer / nhánh play), và lifecycle khi publisher ngắt — vì mình thấy mọi listener và protocol trong SRS cuối cùng đều phục vụ tầng đó.
-
Chuẩn chỉ thì vẫn phải là có manager / source / consumer; điều cần chú ý là trách nhiệm và trạng thái dùng chung, không chỉ tên class.
Code leve Hai core object (quay lại OO)
SrsLiveSource — đây là lõi của một stream: gom media, trạng thái publish và các subscriber cho một định danh stream. SrsLiveSourceManager — lõi của hệ thống lo cho việc đăng ký: map định danh → SrsLiveSource, fetch_or_create, và pool lifecycle.
Code flow: Manager → Source → Consumer
-
Registry toàn cục — Lúc global init, SRS tạo _srs_sources (SrsLiveSourceManager). Đây là điểm anchor cho live RTMP và nhiều đường vào khác.
-
Một stream, một source — Manager giữ pool_ (key → SrsLiveSource) và API fetch_or_create / fetch. Cùng một stream (theo ISrsRequest) tái sử dụng cùng một object source.
-
Bridge từ connection — Trong SrsRtmpConn, sau khi có req, gọi live_sources_->fetch_or_create, rồi rẽ publish vs play. Đó là chỗ mà RTMP conn gắn vào shared live path: play đi vào playing(live_source) (và consumer bên dưới); publish đi nhánh khác nhưng cùng live_source. Chi tiết sở hữu / subscribe nằm trong mỗi nhánh và trong SrsLiveSource / SrsLiveConsumer (coi ví dụ trong srs_app_rtmp_source.hpp).
-
Lifecycle — trace disconnect, boundary của app thì vẫn là socket thoai: chủ yếu là mình xem nhánh publish dọn source, hủy publisher và consumer thế nào — trả lời cho câu hỏi đó là nếu publisher tạch thì stream còn hay tạch theo
Túm lại: shared live media plane là nơi hội tụ / khách hàng thực sự mà cả cấu trúc cần phục vụ. Protocol/decode cuối cùng đều hướng về một manager - một source cho mỗi stream identity, và nhiều consumer trên cùng source đó (share source).