StartController.class.php 4.26 KB
<?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;
    }
}