StartController.class.php
4.26 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
<?php
/**
* Created by PhpStorm.
* User: zhoutao
* Date: 2018/1/17
* Time: 下午4:38
*/
namespace Apicp\Controller\LiveRoom;
use Com\LiveSDK;
use Common\Common\Constant;
use Common\Model\CronModel;
use Common\Model\StudioModel;
use Common\Service\CronService;
use Common\Service\StudioService;
use VcySDK\Cron;
use VcySDK\Service;
class StartController extends AbstractController
{
/**
* Start
* @author zhoutao
* @desc 开始直播接口
* @param Int lm_id:true:1 直播活动ID
* @return array|bool
array(
)
*/
public function Index()
{
// 获取直播室数据
$mainDetail = $this->liveMainDetail;
// 还没到开始推流时间
if (MILLI_TIME <= ($mainDetail['start_time'] - Constant::LIVE_ALLOW_EARLY_START_TIME)) {
E('_ERR_LIVE_HAS_NOT_START');
}
// 没有直播室数据
$studioServ = new StudioService();
$studioDetail = $this->studioDetail;
if ($studioDetail['stream_status'] == Constant::STREAM_STATUS_ALLOW_PUSH) {
return true;
}
$liveSdk = new LiveSDK();
try {
// 允许推流
$liveSdk->channelSetStatus($studioDetail['stream_id'], $liveSdk::CHANNEL_STATUS_ALLOW);
$studioServ->update_by_conds(
[
'lm_id' => $mainDetail['lm_id']
],
[
'stream_status' => Constant::STREAM_STATUS_ALLOW_PUSH
],
true
);
// 创建 结束直播计划任务
$cronSdk = new Cron(Service::instance());
$cronServ = new CronService();
$cronInsertData = [];
$cronResult = $cronSdk->add([
'crRemark' => 'live_room_end',
'crType' => Cron::CR_TYPE_CALLBACK,
'crMethod' => 'POST',
'crParams' => json_encode([
'lm_id' => $mainDetail['lm_id']
]),
// 回调地址
'crReqUrl' => oaUrl('Frontend/Callback/End/Index', [], $mainDetail['domain']),
'crTimes' => 1,
// 最长 24小时 自动关闭直播
'crCron' => rgmdate(MILLI_TIME + 86400 * 1000, 's i G j n ? Y'),
'crMonitorExecution' => $cronSdk::CR_MONITOR_EXECUTION_FALSE,
'crDescription' => '直播间超过24小时自动结束',
]);
$cronInsertData[] = [
'lm_id' => $mainDetail['lm_id'],
'cron_id' => $cronResult['crId'],
'type' => CronModel::TYPE_LIVE_IM_ROOM_END,
'domain' => $mainDetail['domain']
];
// 获取腾讯云在线人数
$cronResult = $cronSdk->add([
'crRemark' => 'live_play_stat_history',
'crType' => Cron::CR_TYPE_CALLBACK,
'crMethod' => 'POST',
'crParams' => json_encode([
'streamId' => $studioDetail['stream_id']
]),
// 回调地址
'crReqUrl' => oaUrl('Frontend/Callback/StatHistory/Index', [], $mainDetail['domain']),
'crCron' => '0 0/2 * * * ?',
'crMonitorExecution' => $cronSdk::CR_MONITOR_EXECUTION_FALSE,
'crDescription' => '获取直播腾讯云在线人数',
]);
$cronInsertData[] = [
'lm_id' => $mainDetail['lm_id'],
'cron_id' => $cronResult['crId'],
'type' => CronModel::TYPE_LIVE_STAT_HISTORY,
'domain' => $mainDetail['domain']
];
$cronServ->insert_all($cronInsertData);
} catch (\Exception $e) {
// 出错回滚
// 禁止推流
$liveSdk->channelSetStatus($studioDetail['stream_id'], $liveSdk::CHANNEL_STATUS_CUT_OFF);
$studioServ->update_by_conds(
[
'lm_id' => $mainDetail['lm_id']
],
[
'stream_status' => Constant::STREAM_TYPE_STATUS_DISABLED
],
true
);
E($e->getCode() . ':' . $e->getMessage());
}
return true;
}
}