srs在直播中断时自动填充式播放广告视频

为什么要这样修改呢?当然是有特别的场景需要。比如某一个直播,推流中断。这时,
服务器直接用一个广告推流来替代。当直播恢复后,强行踢掉广告流。
因为主播流和广告流是使用的同一个直播地址,因此,需要这个踢流机制。
原来的播主网络恢复了,他要继续推流。如何处理呢?最好的办法不是发消息让广告进程停止注入。
而是强迫广告进程让出原来的播主频道。
srs原来提供了一个kickoff流的http-api。那是利用coroutine的机制来实现的,感觉非常危险。
容易易导致程序crash。并且,也没有必要那样做,只需要想办法exit rtmp-publishing处理线程
就可以了。关键算法程序如下:
srs_error_t SrsRtmpConn::stream_service_cycle()
{
    ...
    srs_trace("find a source for source-ip:%s, type=%d",ip.c_str(),info->type);
    int ret=0;
    SrsSource* source = NULL;
    if (info->type == SrsRtmpConnUnknown){
        return srs_error_new(ERROR_RTMP_STREAM_NOT_FOUND, "rtmp: unknown stream");
    }
    else if (info->type == SrsRtmpConnPlay){
        ret = _srs_sources->find_for_play(req, server, &source);
    }
    else{
        if ((ip == "127.0.0.1")){
            _srs_sources->local_create(req, server, &source);
        }else{
            srs_warn("%s/%s:Force local-publisher quit!",req->app.c_str(),req->stream.c_str());
            string local_pusher_url = "127.0.0.1-" + req->app + "/" + req->stream;
            std::map<string,int>::iterator it;
            it = gRtmpConnExitFlagTbl.find(local_pusher_url);
            if (it != gRtmpConnExitFlagTbl.end()){
                gRtmpConnExitFlagTbl.at(local_pusher_url) = 111111;    //force quit if exist
                usleep(30000);
            }
            
            if ((ret = _srs_sources->fetch_or_create(req, server, &source)) <0) {
                return srs_error_new(ERROR_RTMP_ACCESS_DENIED, "rtmp: fetch source");
            }
        }
    }
    ...
}
经测试,播主和中断式广告相互切换非常流畅。
 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

草根大哥

进军大神程序员路上,谢谢支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值