216 lines
6.8 KiB
PHP
216 lines
6.8 KiB
PHP
<?php
|
|
|
|
namespace app\common\model\live;
|
|
|
|
use think\Model;
|
|
use fast\Random;
|
|
|
|
class Room extends Model
|
|
{
|
|
|
|
|
|
// 表名
|
|
protected $name = 'live_room';
|
|
|
|
// 自动写入时间戳字段
|
|
protected $autoWriteTimestamp = 'integer';
|
|
|
|
// 定义时间戳字段名
|
|
protected $createTime = 'createtime';
|
|
protected $updateTime = false;
|
|
protected $deleteTime = false;
|
|
|
|
// 追加属性
|
|
protected $append = [
|
|
|
|
];
|
|
|
|
|
|
/**
|
|
* 通过课程获取直播间信息
|
|
* @param $courseId
|
|
* @return false
|
|
*/
|
|
public function courseGetRoom($courseId){
|
|
$data = self::with(['course'])
|
|
->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);
|
|
}
|
|
}
|