quanwei
2025-11-21 2d9362ae6f528f57e6133d5d80f0b633c24e8eb6
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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
<?php
 
namespace app\api\controller\plus\live\agora;
 
use app\api\controller\Controller;
use app\api\model\plus\live\Room as RoomModel;
use app\common\library\agora\token\TokenService;
use app\common\model\plus\live\UserGift as UserGiftModel;
use app\common\model\settings\Setting as SettingModel;
 
/**
 * 声网api
 */
class Api extends Controller
{
    /**
     * 登录房间
     */
    public function login($room_id, $channel, $isCaster = false)
    {
        $user = $this->getUser();
        $value = SettingModel::getItem('live');
        $appId = $value['app_id'];
        $appCertificate = $value['key'];
        $userSign = TokenService::getRtcToken($user['user_id'], $channel, $appId, $appCertificate, $isCaster);
        //累计观看人数
        (new RoomModel())->where('room_id', '=', $room_id)->inc('view_num')->update();
        $room = RoomModel::detail($room_id);
        $user_gift_model = UserGiftModel::detail($room_id, $user['user_id']);
        if (!$user_gift_model) {
            // 插入用户礼物表
            (new UserGiftModel())->save([
                'room_id' => $room_id,
                'user_id' => $user['user_id'],
                'app_id' => $room['app_id']
            ]);
        }
        return $this->renderSuccess('', compact('userSign', 'user', 'appId'));
    }
 
    /**
     * rtm授权
     */
    public function rtmToken()
    {
        $user = $this->getUser();
        $value = SettingModel::getItem('live');
        $appId = $value['app_id'];
        $appCertificate = $value['key'];
        $userSign = TokenService::getRtmToken($user['user_id'] . "", $appId, $appCertificate);
        return $this->renderSuccess('', compact('userSign'));
    }
 
    /**
     * 请求录制
     */
    public function record_acquire($room_id)
    {
        $settings = SettingModel::getItem('live');
        if($settings['is_record'] == 0){
            return $this->renderSuccess('');
        }
        $room = RoomModel::detail($room_id);
        if($room['record_resource_id'] != ''){
            return $this->renderSuccess('');
        }
        $curl = curl_init();
        $header = [
            'Content-Type: application/json',
            'Authorization: Basic ' . base64_encode($settings['username'] . ':' . $settings['password'])
        ];
        $data = "{
          \"cname\": \"{$room['room_name']}\",
          \"uid\": \"{$room['record_uid']}\",
          \"clientRequest\":{
          }
        }";
        curl_setopt($curl, CURLOPT_URL, "https://api.agora.io/v1/apps/{$settings['app_id']}/cloud_recording/acquire");
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
        curl_setopt($curl, CURLOPT_HEADER, false);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($curl, CURLOPT_POST, TRUE);
        curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
 
        $response = json_decode(curl_exec($curl), true);
        curl_close($curl);
        $resourceId = $response['resourceId'];
        $room->save([
            'record_resource_id' => $resourceId
        ]);
        return $this->renderSuccess('');
    }
 
    /**
     * 开始录制
     * {
     * "resourceId": "nUwUbQf9Zg6tsgtLslGnDg0lk8RYaUE09pqOuSIgwfx_RCWYj4P3oDfpUoGbm4kTO6pcgOOsoogy0zqHVMN-Xt-D_pSRZoGKePV1i5mt-MWp-wsSGHFVRYqVnNYhiNE4VhDf33vBNJw4FReRsORLxajYLaR0TeQJL5M_V8mGvkZeg9KQ_9TmOtlyWxpavS7ynAsMQuDEk_V7Pbl1HLC5_dxFLTcCc4rH9mBZ7gUCjELwKyf-uoxgMAuOjtZHibf1ba-ZW_zijbsf8fxHYSGK84ud3iSi5Z-UH9DZWZbnMN1KJ1zA1pnU1-i2kTb_9TSV",
     * "sid": "661086d50844a5a9b680f6808a4b668c"
     * }
     */
    public function record_start($room_id)
    {
        $settings = SettingModel::getItem('live');
        if($settings['is_record'] == 0){
            return $this->renderSuccess('');
        }
        $room = RoomModel::detail($room_id);
        if($room['record_sid'] != ''){
            return $this->renderSuccess('');
        }
        $curl = curl_init();
 
        $header = [
            'Content-Type: application/json',
            'Authorization: Basic ' . base64_encode($settings['username'] . ':' . $settings['password'])
        ];
        $userSign = TokenService::getRtcToken($room['record_uid'], $room['room_name'], $settings['app_id'], $settings['key'], false);
        $data = "{
            \"cname\":\"{$room['room_name']}\",
            \"uid\":\"{$room['record_uid']}\",
            \"clientRequest\":{
                \"token\":\"{$userSign}\",
                \"recordingConfig\":{
                    \"maxIdleTime\":300,
                    \"streamTypes\":2,
                    \"audioProfile\":1,
                    \"channelType\":1,
                    \"videoStreamType\":0
                },
                \"storageConfig\":{
                    \"vendor\":{$settings['vendor']},
                    \"region\": {$settings['region']},
                    \"bucket\":\"{$settings['bucket']}\",
                    \"accessKey\":\"{$settings['accessKey']}\",
                    \"secretKey\":\"{$settings['secretKey']}\"
                }    
            }
        }";
        //\"fileNamePrefix\":{$settings['fileNamePrefix']}
        curl_setopt($curl, CURLOPT_URL, "https://api.agora.io/v1/apps/{$settings['app_id']}/cloud_recording/resourceid/{$room['record_resource_id']}/mode/mix/start");
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
        curl_setopt($curl, CURLOPT_HEADER, false);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($curl, CURLOPT_POST, TRUE);
        curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
 
        $response = json_decode(curl_exec($curl), true);
        curl_close($curl);
        $sid = '';
        if($response['sid']){
            $sid = $response['sid'];
            $room->save([
                'record_sid' => $sid
            ]);
        }
        return $this->renderSuccess('', compact('sid'));
    }
 
    /**
     * 请求录制
     */
    public function record_query($room_id)
    {
        $settings = SettingModel::getItem('live');
        if($settings['is_record'] == 0){
            return $this->renderSuccess('');
        }
        $room = RoomModel::detail($room_id);
        if($room['record_sid'] == ''){
            return $this->renderSuccess('');
        }
        $curl = curl_init();
        $header = [
            'Content-Type: application/json',
            'Authorization: Basic ' . base64_encode($settings['username'] . ':' . $settings['password'])
        ];
        $url = "https://api.agora.io/v1/apps/{$settings['app_id']}/cloud_recording/resourceid/{$room['record_resource_id']}/sid/{$room['record_sid']}/mode/mix/query";
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
        curl_setopt($curl, CURLOPT_HEADER, false);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
 
        $response = json_decode(curl_exec($curl), true);
        curl_close($curl);
        $record_url = $response['serverResponse']['fileList'];
        if($record_url != ''){
            $room->save([
                'record_url' => $settings['domain']. '/'.$record_url
            ]);
        }
        return $this->renderSuccess('', compact('record_url'));
    }
 
    /**
     * 停止录制
     */
    public function record_stop($room_id)
    {
        $settings = SettingModel::getItem('live');
        $room = RoomModel::detail($room_id);
        if($room['record_sid'] == ''){
            return $this->renderSuccess('');
        }
        $curl = curl_init();
        $header = [
            'Content-Type: application/json',
            'Authorization: Basic ' . base64_encode($settings['username'] . ':' . $settings['password'])
        ];
        $data = "{
          \"cname\": \"{$room['room_name']}\",
          \"uid\": \"{$room['record_uid']}\",
          \"clientRequest\":{
          }
        }";
        curl_setopt($curl, CURLOPT_URL, "https://api.agora.io/v1/apps/{$settings['app_id']}/cloud_recording/resourceid/{$room['record_resource_id']}/sid/{$room['record_sid']}/mode/mix/stop");
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
        curl_setopt($curl, CURLOPT_HEADER, false);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($curl, CURLOPT_POST, TRUE);
        curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
 
        $response = json_decode(curl_exec($curl), true);
        curl_close($curl);
        return $this->renderSuccess('');
    }
}