where([ 'course_id'=>$courseId ])->find(); // ->cache(\app\common\constant\cache\Keys::LIVE_ROOM_CONFIG.$courseId) if(!$data){ return false; } if($data['course']['live_type'] == 2){ //这里是伪直播 $liveVideo = json_decode($data['course']['live_video'],true); $liveVideo['fullurl'] = parse_file_url($liveVideo['url'],$liveVideo['storage']); $data['push_url'] = [ 'hls'=>$liveVideo['fullurl'] ]; }elseif($data['course']['live_type'] == 3){ //自定义播流地址 $data['push_url'] = [ 'hls'=>$data['course']['live_custom_url'] ]; }else{ $data['push_url'] = \app\common\library\live\Url::playUrl($data['app_name'],$data['stream_name']); // 阿里云直播且开启多清晰度时,生成各清晰度播流地址 if(isset($data['course']['live_type']) && $data['course']['live_type'] == 1){ $liveConfig = \app\common\model\config\System::getConfig('ali_live'); $multiQualityEnabled = isset($liveConfig['multi_quality_enabled']) ? boolval($liveConfig['multi_quality_enabled']) : false; $qualityList = isset($liveConfig['quality_list']) ? $liveConfig['quality_list'] : '[]'; $qualityList = is_string($qualityList) ? json_decode($qualityList, true) : $qualityList; if($multiQualityEnabled && !empty($qualityList) && is_array($qualityList)){ $qualities = []; foreach($qualityList as $quality){ if(!isset($quality['template_id']) || $quality['template_id'] === ''){ continue; } $qualities[] = [ 'name' => isset($quality['name']) ? $quality['name'] : '', 'template_id' => strval($quality['template_id']), 'level' => isset($quality['level']) ? intval($quality['level']) : 0, 'url' => \app\common\library\live\Url::playUrl($data['app_name'], $data['stream_name'], $quality['template_id']) ]; } if(!empty($qualities)){ // 按 level 降序排列(最高画质在前),前端默认使用第一个 usort($qualities, function($a, $b) { return $b['level'] - $a['level']; }); $data['qualities'] = $qualities; } } } } $globalConfig = \app\common\model\app\Config::getConfig('live'); $config = json_decode($data['config'],true); $config = array_merge($globalConfig,$config); // 未安装送礼物插件时,强制关闭礼物功能,避免前端仍请求礼物接口 if(!\app\admin\library\project\App::isInstall('live_gift') || !class_exists('app\admin\model\live\GiftOptions')){ $config['gift'] = 0; } $intField = ['goods','comment_audit','bantalk','gift']; foreach ($intField as $field){ if(isset($config[$field])){ $config[$field] = intval($config[$field]); } } unset($data['course']); $data['config'] = $config; return $data; } /** * 获取直播间状态 * @return void */ public function getRoomStatus($courseId){ $data = self::with(['course']) ->where([ 'course_id'=>$courseId ])->find(); if(!$data){ return false; } $livePushStatus = 'offline'; if($data['course']['live_type'] == 2 || $data['course']['live_type'] == 3){ //判断当前是否在直播时间 if($data['course']['live_start_time'] < time() && $data['course']['live_end_time'] > time()){ $livePushStatus = 'online'; } }else{ try{ $livePushStatus = \app\common\library\live\Room::checkLiveStatus($data['app_name'],$data['stream_name']); }catch (\Exception $e){ $livePushStatus = 'offline'; } } if($livePushStatus == 'online'){ return $livePushStatus; } $data['config'] = json_decode($data['config'],true); if($data->course['live_start_time'] > time()){ //暂未开始 return 'not_start'; } if(time() > $data->course['live_end_time']){ //直播已经结束 //判断是否开始回放, if($data['config']['play_back'] == 1){ //判断是否开启限制回放时间 if($data['config']['play_back_type'] == 1 || (isset($data['config']['play_back_validity_time']) && strtotime($data['config']['play_back_validity_time']) > time())){ //开启后判断有无回放视频 if(\app\common\model\live\Playback::checkHasPlaybackVideo($courseId)){ //回放中 return 'run_playback'; } if($data['course']['live_type'] == 2 && $data['course']['live_video_convert_replay'] == 1){ return 'run_playback'; } //待上传回放 return 'wait_playback'; } } //已结束 未开启回放 return 'end'; } //在直播时间内,判断推流状态 return $livePushStatus; } /** * 获取直播状态列表 * @return string[] */ public function getLiveStatusList(){ return [ 'wait_playback', 'end', 'run_playback', 'not_start', 'online', 'offline', 'forbidden', 'onlinefaild' ]; } public function course() { return $this->belongsTo('app\common\model\course\Course', 'course_id', 'id', [], 'LEFT')->setEagerlyType(0); } }