SRS 代码分析【DVR录像实现】

DVR配置详解:https://github.com/ossrs/srs/wiki/v3_CN_DVR

推流到源站时会调用SrsOrginHub对象提供的initialize, on_publish, on_metadata, on_video, on_audio,on_unpublish函数。

1.SrsOriginHub::initialize初始化时会调用SrsDvr::initialize

srs_error_t SrsDvr::initialize(SrsOriginHub* h, SrsRequest* r)
{
    srs_error_t err = srs_success;
    
    req = r;
    hub = h;
    
    SrsConfDirective* conf = _srs_config->get_dvr_apply(r->vhost);
    actived = srs_config_apply_filter(conf, r);
    
    srs_freep(plan);
    if ((err = SrsDvrPlan::create_plan(r->vhost, &plan)) != srs_success) {
        return srs_error_wrap(err, "create plan");
    }
    
    std::string path = _srs_config->get_dvr_path(r->vhost);
    SrsDvrSegmenter* segmenter = NULL;
    if (srs_string_ends_with(path, ".mp4")) {
        segmenter = new SrsDvrMp4Segmenter();
    } else {
        segmenter = new SrsDvrFlvSegmenter();
    }
    
    if ((err = plan->initialize(hub, segmenter, r)) != srs_success) {
        return srs_error_wrap(err, "plan initialize");
    }
    
    return err;
}

首先调用SrvDvrPlan::create_plan根据配置文件来确定使用session(整个流录制成一个文件SrsDvrSessionPlan)还是segment(按照时长分段录制成多个文件SrsDvrSegmentPlan )的计划,这里只分析SrsDvrSessionPlan。

接着创建SrsDvrSegmenter,这里只分析flv文件录像SrsDvrFlvSegementer。

最后调用plan->initialize。SrsDvrSessionPlan直接使用基类的SrsDvrPlan::initialize;SrsDvrSegmentPlan重写了initialize方法在调用完SrsDvrPlan::initialize后接着从config文件中读取wait_keyframe, cduration配置参数。

SrsDvrPlan::initialize实现如下

srs_error_t SrsDvrPlan::initialize(SrsOriginHub* h, SrsDvrSegmenter* s, SrsRequest* r)
{
    srs_error_t err = srs_success;
    
    hub = h;
    req = r;
    segment = s;
    
    if ((err = segment->initialize(this, r)) != srs_success) {
        return srs_error_wrap(err, "segmenter");
    }
    
    if ((err = async->start()) != srs_success) {
        return srs_error_wrap(err, "async");
    }
    
    return err;
}

SrsDvrPlan::initialize首先调用SrsDvrSegmenter::initialize获取配置文件中的jitter_algorithm, wait_keyframe两个参数

接着调用async->start()开启协程,async是一个任务处理的协程。最终进入协程的循环处理中。

srs_error_t SrsAsyncCallWorker::cycle()
{
    srs_error_t err = srs_success;
    
    while (true) {
        if ((err = trd->pull()) != srs_success) {
            return srs_error_wrap(err, "async call worker");
        }
        
        if (tasks.empty()) {
            srs_cond_wait(wait);
        }
        
        std::vector<ISrsAsyncCallTask*> copy = tasks;
        tasks.clear();
        
        std::vector<ISrsAsyncCallTask*>::iterator it;
        for (it = copy.begin(); it != copy.end(); ++it) {
            ISrsAsyncCallTask* task = *it;
            
            int ret = ERROR_SUCCESS;
            if ((ret = task->call()) != ERROR_SUCCESS) {
                srs_warn("ignore async callback %s, ret
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
华为SRS(软件需求规格说明书)是华为公司开发软件项目的重要文档,它详细描述了软件产品的所有需求,包括功能需求、性能需求、质量需求、安全需求等。本次需求分析主要围绕华为SRS的重要性和编写流程展开。 首先,华为SRS对软件项目的开发和管理具有非常重要的作用。通过明确规定软件产品的需求,可以提高开发效率,减少项目风险和开发成本,为产品的成功交付奠定坚实的基础。 其次,华为SRS的编写流程一般包括需求收集、需求分析、需求说明等步骤。其中,需求收集阶段主要通过与客户沟通、访谈、问卷调查等方式收集用户需求,确保产品功能和业务需求的一致性和风险识别性;需求分析阶段重点是对所收集到的需求进行分析,确认需求的正确性和完整性,同时解决可能出现的矛盾需求;需求说明阶段则是将确认后的需求清晰地描述在文档中,包括需求ID、需求名称、需求描述、需求来源、需求优先级等。 最后,华为SRS是一个不断更新的文档,需求分析是一个持续迭代的过程。在项目的不同阶段,需要根据实际情况调整和更新SRS,保证其与软件开发的进展相一致。 综上所述,华为SRS是软件开发过程中至关重要的一环。良好的需求分析流程,能够保证产品的质量和用户体验,同时提高项目交付的成功率。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值