1、SRS 启动服务
官方已经给了关于 SRS 很详细的分析:https://srs.xianwaizhiyin.net/srs_base/
所以这些文章是自己写来记录学习一个过程
srs_main_server.cpp 是 main 函数所在的文件。启动时会做很多初始化的工作,先不看,直接看关键的地方。
- run_directly_or_daemon函数
srs_error_t run_directly_or_daemon(){
// If not daemon, directly run hybrid server.
if (!run_as_daemon) {
// 启动 Hybird server
if ((err = run_in_thread_pool()) != srs_success) {
return srs_error_wrap(err, "run thread pool");
}
return srs_success;
}
}
- run_in_thread_pool函数
srs_error_t run_in_thread_pool(){
// Start the hybrid service worker thread, for RTMP and RTC server, etc.
if ((err = _srs_thread_pool->execute("hybrid", run_hybrid_server, (void*)NULL)) != srs_success) {
return srs_error_wrap(err, "start hybrid server thread");
}
srs_trace("Pool: Start threads primordial=1, hybrids=1 ok");
return _srs_thread_pool->run();
}
_srs_thread_pool是线程池SrsThreadPool的实例对象。
这里很显然,将启动Hybird server这个任务post 到线程池的任务队列中。
- run_hybrid_server函数
srs_error_t run_hybrid_server(void* /*arg*/)
{
srs_error_t err = srs_success;
// 创建并注册RTMP 服务
_srs_hybrid->register_server(new SrsServerAdapter());
#ifdef SRS_SRT
// 创建并注册SRT服务
_srs_hybrid->register_server(new SrsSrtServerAdapter());
#endif
#ifdef SRS_RTC
//创建并注册 WebRTC 服务
_srs_hybrid->register_server(new RtcServerAdapter());
#endif
//此函数内部分别启动几个周期定时器,并以遍历方式调用上面已注册服务器的initialize()函数
if ((err = _srs_hybrid->initialize()) != srs_success) {
return srs_error_wrap(err, "hybrid initialize");
}
// 此模块用于防止服务器过载,实现过载保护
if ((err = _srs_circuit_breaker->initialize()) != srs_success) {
return srs_error_wrap(err, "init circuit breaker");
}
#ifdef SRS_APM
// When startup, create a span for server information.
ISrsApmSpan* span = _srs_apm->span("main")->set_kind(SrsApmKindServer);
srs_freep(span);
#endif
// 此函数内部以遍历方式调用上面已注册服务器的run接口,并在最后
// 调用srs_usleep(SRS_UTIME_NO_TIMEOUT)使当前的原始协程进入休眠状态
if ((err = _srs_hybrid->run()) != srs_success) {
return srs_error_wrap(err, "hybrid run");
}
// 如果执行到这里,表示整个服务已结束,程序即将退出
_srs_hybrid->stop();
return err;
}
从上面函数可以看到:
(1)创建注册RTMP、SRT、WebRTC服务
(2)初始化注册的服务
(3)启动注册进来的服务(调它们的 run 接口方法)
- SrsHybridServer::run()函数
srs_error_t SrsHybridServer::run()
{
srs_error_t err = srs_success;
// Wait for all servers which need to do cleanup.
SrsWaitGroup wg;
vector<ISrsHybridServer*>::iterator it;
for (it = servers.begin(); it != servers.end(); ++it) {
ISrsHybridServer* server = *it;
//以遍历的方式启动注册进来的服务
if ((err = server->run(&wg)) != srs_success) {
return srs_error_wrap(err, "run server");
}
}
// Wait for all server to quit.
wg.wait();
return err;
}
会在其他文章中分析:
- SrsServerAdapter
- SrsSrtServerAdapter
- RtcServerAdapter
- SrsHybridServer