您的位置:首页 > 其它

直播源码中一对一直播功能的实现教程

2019-01-14 10:01 295 查看
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yb1314111/article/details/86468548

在传统直播APP中,由于受众过多,主播无法及时对每一个粉丝做出反馈,因此粉丝难免会希望能与主播进行一对一视频聊天,针对这种情况,为了实现一对一直播功能,我们的程序员对直播源码进行了开发,将该功能写入了直播源码中。
操作流程大约是:粉丝首先对主播进行一对一直播邀请,这个邀请相当于用户获取自己的直播流将之推送云服务器(如到阿里云或者腾讯云等),尚若主播同意进行一对一直播,那么就要把用户推的流从云服务器上拉下来,下面我们以腾讯云服务器为例,讲一下这部分的流程。

$uid=$this->uid;
$configpri = $this->getConfigPri();

$bizid = $configpri['tx_bizid']; //申请的腾讯云直播ID
$push_url_key = $configpri['tx_push_key']; //申请的腾讯云直播key
$tmp_id = str_replace(array("@","#","-"),"_",$uid);
$now_time = time();
$now_time2 = $now_time + 3*60*60;
$txTime = dechex($now_time2);
$live_code = $bizid . "_" . $tmp_id . "_" . $txTime;

$txSecret = md5($push_url_key . $live_code . $txTime);
$safe_url = "&txSecret=" . $txSecret."&txTime=" .$txTime;
$push_url = "rtmp://livepush.yunbaozb.com/live/" . $live_code . "?bizid=" . $bizid .$safe_url;
$play_url = "rtmp://liveplay.yunbaozb.com/live/".$live_code. "?bizid=" . $bizid .$safe_url;
$info=array(
"pushurl" => $push_url,
"timestamp" => $now_time,
"playurl" => $play_url
);

通过上面的代码,我们可以实现主播与用户之间流的相互交换,主播与用户进行一对一直播的过程可以是免费的也可以是计时收费的,在主播与用户进行一对一直播的过程中,其他用户无法再对主播进行一对一直播邀请,所以我们要在用户对主播发出一对一直播申请时,对主播目前的直播状态进行检查。

/* 直播状态 */
public function checkLive($uid,$liveuid,$stream){
$islive=DI()->notorm->users_live
->select("islive,type,type_val,starttime")
->where('uid=? and stream=?',$liveuid,$stream)
->fetchOne();
if(!$islive || $islive['islive']==0){
return 1005;
}
$rs['type']=$islive['type'];
$rs['type_val']='0';
$rs['type_msg']='';
$userinfo=DI()->notorm->users
->select("issuper")
->where('id=?',$uid)
->fetchOne();
if($userinfo && $userinfo['issuper']==1){
if($islive['type']==6 || $islive['type']==9){
return 1007;
}
$rs['type']='0';
$rs['type_val']='0';
$rs['type_msg']='';
return $rs;
}
$rs['xianmian']='0';
if($islive['type']==1){
$rs['type_msg']=md5($islive['type_val']);
}else if($islive['type']==2){
$rs['type_msg']='本房间为收费房间,需支付'.$islive['type_val'].'钻石';
$rs['type_val']=$islive['type_val'];
$isexist=DI()->notorm->users_coinrecord
->select('id')
->where('uid=? and touid=? and showid=? and action="roomcharge" and type="expend"',$uid,$liveuid,$islive['starttime'])
->fetchOne();
if($isexist){
$rs['type']='0';
$rs['type_val']='0';
$rs['type_msg']='';
}
}else if($islive['type']==3){
$rs['type_val']=$islive['type_val'];
$rs['type_msg']='本房间为计时房间,每分钟需支付'.$islive['type_val'].'钻石';
}else if($islive['type']==6){
$rs['type_val']=$islive['type_val'];
$rs['type_msg']='本房间为1V1房间,每分钟需支付'.$islive['type_val'].'钻石';
}else if($islive['type']==9){
$check = DI()->redis -> hget('1v1a',$liveuid);
if($check == $uid){
$rs['type_val']=$islive['type_val'];
$rs['type_msg']='本房间为1V1房间,每分钟需支付'.$islive['type_val'].'钻石';
$userinfo = DI()->notorm->users->select("xianmian")->where("id = {$liveuid}")->fetchOne();
$configpub = $this->getConfigPub();
$rs['xianmian'] = $userinfo['xianmian'] == 0 ? $configpub['xianmian'] * 60 : $userinfo['xianmian'] * 60;
}else{
return 1008;
}
}

有两个问题请大家注意一下:
1、如果获取流时失败,请检查一下配置的云的ID与key是否正确,如果依然失败,就去查看下一下云API文档以及demo以获取详细解释。
2、“检查直播状态”的过程出现问题时,可以检查一下主播在与用户成功发起一对一直播后有没有改变主播的状态
以上就是关于直播源码中一对一直播功能实现的源码解决办法,更多干货内容会在我的CSDN博客中逐渐放出,有需要的朋友可以关注我,有问题可以在评论区中提问我。
声明:本文为原创文章,转载请注明出处及作者

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: