Api.php 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. <?php
  2. namespace app\api\controller\plus\live\agora;
  3. use app\api\controller\Controller;
  4. use app\api\model\plus\live\Room as RoomModel;
  5. use app\common\library\agora\token\TokenService;
  6. use app\common\model\plus\live\UserGift as UserGiftModel;
  7. use app\common\model\settings\Setting as SettingModel;
  8. /**
  9. * 声网api
  10. */
  11. class Api extends Controller
  12. {
  13. /**
  14. * 登录房间
  15. */
  16. public function login($room_id, $channel, $isCaster = false)
  17. {
  18. $user = $this->getUser();
  19. $value = SettingModel::getItem('live');
  20. $appId = $value['app_id'];
  21. $appCertificate = $value['key'];
  22. $userSign = TokenService::getRtcToken($user['user_id'], $channel, $appId, $appCertificate, $isCaster);
  23. //累计观看人数
  24. (new RoomModel())->where('room_id', '=', $room_id)->inc('view_num')->update();
  25. $room = RoomModel::detail($room_id);
  26. $user_gift_model = UserGiftModel::detail($room_id, $user['user_id']);
  27. if (!$user_gift_model) {
  28. // 插入用户礼物表
  29. (new UserGiftModel())->save([
  30. 'room_id' => $room_id,
  31. 'user_id' => $user['user_id'],
  32. 'app_id' => $room['app_id']
  33. ]);
  34. }
  35. return $this->renderSuccess('', compact('userSign', 'user', 'appId'));
  36. }
  37. /**
  38. * rtm授权
  39. */
  40. public function rtmToken()
  41. {
  42. $user = $this->getUser();
  43. $value = SettingModel::getItem('live');
  44. $appId = $value['app_id'];
  45. $appCertificate = $value['key'];
  46. $userSign = TokenService::getRtmToken($user['user_id'] . "", $appId, $appCertificate);
  47. return $this->renderSuccess('', compact('userSign'));
  48. }
  49. /**
  50. * 请求录制
  51. */
  52. public function record_acquire($room_id)
  53. {
  54. $settings = SettingModel::getItem('live');
  55. if($settings['is_record'] == 0){
  56. return $this->renderSuccess('');
  57. }
  58. $room = RoomModel::detail($room_id);
  59. if($room['record_resource_id'] != ''){
  60. return $this->renderSuccess('');
  61. }
  62. $curl = curl_init();
  63. $header = [
  64. 'Content-Type: application/json',
  65. 'Authorization: Basic ' . base64_encode($settings['username'] . ':' . $settings['password'])
  66. ];
  67. $data = "{
  68. \"cname\": \"{$room['room_name']}\",
  69. \"uid\": \"{$room['record_uid']}\",
  70. \"clientRequest\":{
  71. }
  72. }";
  73. curl_setopt($curl, CURLOPT_URL, "https://api.agora.io/v1/apps/{$settings['app_id']}/cloud_recording/acquire");
  74. curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
  75. curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
  76. curl_setopt($curl, CURLOPT_HEADER, false);
  77. curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
  78. curl_setopt($curl, CURLOPT_POST, TRUE);
  79. curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
  80. $response = json_decode(curl_exec($curl), true);
  81. curl_close($curl);
  82. $resourceId = $response['resourceId'];
  83. $room->save([
  84. 'record_resource_id' => $resourceId
  85. ]);
  86. return $this->renderSuccess('');
  87. }
  88. /**
  89. * 开始录制
  90. * {
  91. * "resourceId": "nUwUbQf9Zg6tsgtLslGnDg0lk8RYaUE09pqOuSIgwfx_RCWYj4P3oDfpUoGbm4kTO6pcgOOsoogy0zqHVMN-Xt-D_pSRZoGKePV1i5mt-MWp-wsSGHFVRYqVnNYhiNE4VhDf33vBNJw4FReRsORLxajYLaR0TeQJL5M_V8mGvkZeg9KQ_9TmOtlyWxpavS7ynAsMQuDEk_V7Pbl1HLC5_dxFLTcCc4rH9mBZ7gUCjELwKyf-uoxgMAuOjtZHibf1ba-ZW_zijbsf8fxHYSGK84ud3iSi5Z-UH9DZWZbnMN1KJ1zA1pnU1-i2kTb_9TSV",
  92. * "sid": "661086d50844a5a9b680f6808a4b668c"
  93. * }
  94. */
  95. public function record_start($room_id)
  96. {
  97. $settings = SettingModel::getItem('live');
  98. if($settings['is_record'] == 0){
  99. return $this->renderSuccess('');
  100. }
  101. $room = RoomModel::detail($room_id);
  102. if($room['record_sid'] != ''){
  103. return $this->renderSuccess('');
  104. }
  105. $curl = curl_init();
  106. $header = [
  107. 'Content-Type: application/json',
  108. 'Authorization: Basic ' . base64_encode($settings['username'] . ':' . $settings['password'])
  109. ];
  110. $userSign = TokenService::getRtcToken($room['record_uid'], $room['room_name'], $settings['app_id'], $settings['key'], false);
  111. $data = "{
  112. \"cname\":\"{$room['room_name']}\",
  113. \"uid\":\"{$room['record_uid']}\",
  114. \"clientRequest\":{
  115. \"token\":\"{$userSign}\",
  116. \"recordingConfig\":{
  117. \"maxIdleTime\":300,
  118. \"streamTypes\":2,
  119. \"audioProfile\":1,
  120. \"channelType\":1,
  121. \"videoStreamType\":0
  122. },
  123. \"storageConfig\":{
  124. \"vendor\":{$settings['vendor']},
  125. \"region\": {$settings['region']},
  126. \"bucket\":\"{$settings['bucket']}\",
  127. \"accessKey\":\"{$settings['accessKey']}\",
  128. \"secretKey\":\"{$settings['secretKey']}\"
  129. }
  130. }
  131. }";
  132. //\"fileNamePrefix\":{$settings['fileNamePrefix']}
  133. curl_setopt($curl, CURLOPT_URL, "https://api.agora.io/v1/apps/{$settings['app_id']}/cloud_recording/resourceid/{$room['record_resource_id']}/mode/mix/start");
  134. curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
  135. curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
  136. curl_setopt($curl, CURLOPT_HEADER, false);
  137. curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
  138. curl_setopt($curl, CURLOPT_POST, TRUE);
  139. curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
  140. $response = json_decode(curl_exec($curl), true);
  141. curl_close($curl);
  142. $sid = '';
  143. if($response['sid']){
  144. $sid = $response['sid'];
  145. $room->save([
  146. 'record_sid' => $sid
  147. ]);
  148. }
  149. return $this->renderSuccess('', compact('sid'));
  150. }
  151. /**
  152. * 请求录制
  153. */
  154. public function record_query($room_id)
  155. {
  156. $settings = SettingModel::getItem('live');
  157. if($settings['is_record'] == 0){
  158. return $this->renderSuccess('');
  159. }
  160. $room = RoomModel::detail($room_id);
  161. if($room['record_sid'] == ''){
  162. return $this->renderSuccess('');
  163. }
  164. $curl = curl_init();
  165. $header = [
  166. 'Content-Type: application/json',
  167. 'Authorization: Basic ' . base64_encode($settings['username'] . ':' . $settings['password'])
  168. ];
  169. $url = "https://api.agora.io/v1/apps/{$settings['app_id']}/cloud_recording/resourceid/{$room['record_resource_id']}/sid/{$room['record_sid']}/mode/mix/query";
  170. curl_setopt($curl, CURLOPT_URL, $url);
  171. curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
  172. curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
  173. curl_setopt($curl, CURLOPT_HEADER, false);
  174. curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
  175. $response = json_decode(curl_exec($curl), true);
  176. curl_close($curl);
  177. $record_url = $response['serverResponse']['fileList'];
  178. if($record_url != ''){
  179. $room->save([
  180. 'record_url' => $settings['domain']. '/'.$record_url
  181. ]);
  182. }
  183. return $this->renderSuccess('', compact('record_url'));
  184. }
  185. /**
  186. * 停止录制
  187. */
  188. public function record_stop($room_id)
  189. {
  190. $settings = SettingModel::getItem('live');
  191. $room = RoomModel::detail($room_id);
  192. if($room['record_sid'] == ''){
  193. return $this->renderSuccess('');
  194. }
  195. $curl = curl_init();
  196. $header = [
  197. 'Content-Type: application/json',
  198. 'Authorization: Basic ' . base64_encode($settings['username'] . ':' . $settings['password'])
  199. ];
  200. $data = "{
  201. \"cname\": \"{$room['room_name']}\",
  202. \"uid\": \"{$room['record_uid']}\",
  203. \"clientRequest\":{
  204. }
  205. }";
  206. 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");
  207. curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
  208. curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
  209. curl_setopt($curl, CURLOPT_HEADER, false);
  210. curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
  211. curl_setopt($curl, CURLOPT_POST, TRUE);
  212. curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
  213. $response = json_decode(curl_exec($curl), true);
  214. curl_close($curl);
  215. return $this->renderSuccess('');
  216. }
  217. }