五、SRS5.0 分析(1)启动服务

1、SRS 启动服务

官方已经给了关于 SRS 很详细的分析:https://srs.xianwaizhiyin.net/srs_base/

所以这些文章是自己写来记录学习一个过程

srs_main_server.cpp 是 main 函数所在的文件。启动时会做很多初始化的工作,先不看,直接看关键的地方。

  1. 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;
    }
}
  1. 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 到线程池的任务队列中。

  1. 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 接口方法)

  1. 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
  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值