AppClient.php 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. <?php
  2. namespace Qiniu\Rtc;
  3. use Qiniu\Http\Client;
  4. use Qiniu\Http\Error;
  5. use Qiniu\Config;
  6. use Qiniu\Auth;
  7. class AppClient
  8. {
  9. private $auth;
  10. private $baseURL;
  11. public function __construct(Auth $auth)
  12. {
  13. $this->auth = $auth;
  14. $this->baseURL = sprintf("%s/%s/apps", Config::RTCAPI_HOST, Config::RTCAPI_VERSION);
  15. }
  16. /*
  17. * hub: 直播空间名
  18. * title: app 的名称 注意,Title 不是唯一标识,重复 create 动作将生成多个 app
  19. * maxUsers:人数限制
  20. * NoAutoKickUser: bool 类型,可选,禁止自动踢人(抢流)。默认为 false ,
  21. 即同一个身份的 client (app/room/user) ,新的连麦请求可以成功,旧连接被关闭。
  22. */
  23. public function createApp($hub, $title, $maxUsers = null, $noAutoKickUser = null)
  24. {
  25. $params['hub'] = $hub;
  26. $params['title'] = $title;
  27. if (!empty($maxUsers)) {
  28. $params['maxUsers'] = $maxUsers;
  29. }
  30. if (!empty($noAutoKickUser)) {
  31. $params['noAutoKickUser'] = $noAutoKickUser;
  32. }
  33. $body = json_encode($params);
  34. $ret = $this->post($this->baseURL, $body);
  35. return $ret;
  36. }
  37. /*
  38. * appId: app 的唯一标识,创建的时候由系统生成。
  39. * Title: app 的名称, 可选。
  40. * Hub: 绑定的直播 hub,可选,用于合流后 rtmp 推流。
  41. * MaxUsers: int 类型,可选,连麦房间支持的最大在线人数。
  42. * NoAutoKickUser: bool 类型,可选,禁止自动踢人。
  43. * MergePublishRtmp: 连麦合流转推 RTMP 的配置,可选择。其详细配置包括如下
  44. Enable: 布尔类型,用于开启和关闭所有房间的合流功能。
  45. AudioOnly: 布尔类型,可选,指定是否只合成音频。
  46. Height, Width: int64,可选,指定合流输出的高和宽,默认为 640 x 480。
  47. OutputFps: int64,可选,指定合流输出的帧率,默认为 25 fps 。
  48. OutputKbps: int64,可选,指定合流输出的码率,默认为 1000 。
  49. URL: 合流后转推旁路直播的地址,可选,支持魔法变量配置按照连麦房间号生成不同的推流地址。如果是转推到七牛直播云,不建议使用该配置。
  50. StreamTitle: 转推七牛直播云的流名,可选,支持魔法变量配置按照连麦房间号生成不同的流名。例如,配置 Hub 为 qn-zhibo ,配置 StreamTitle 为 $(roomName) ,则房间 meeting-001 的合流将会被转推到 rtmp://pili-publish.qn-zhibo.***.com/qn-zhibo/meeting-001地址。详细配置细则,请咨询七牛技术支持。
  51. */
  52. public function updateApp($appId, $hub, $title, $maxUsers = null, $mergePublishRtmp = null, $noAutoKickUser = null)
  53. {
  54. $url = $this->baseURL . '/' . $appId;
  55. $params['hub'] = $hub;
  56. $params['title'] = $title;
  57. if (!empty($maxUsers)) {
  58. $params['maxUsers'] = $maxUsers;
  59. }
  60. if (!empty($noAutoKickUser)) {
  61. $params['noAutoKickUser'] = $noAutoKickUser;
  62. }
  63. if (!empty($mergePublishRtmp)) {
  64. $params['mergePublishRtmp'] = $mergePublishRtmp;
  65. }
  66. $body = json_encode($params);
  67. $ret = $this->post($url, $body);
  68. return $ret;
  69. }
  70. /*
  71. * appId: app 的唯一标识,创建的时候由系统生成。
  72. */
  73. public function getApp($appId)
  74. {
  75. $url = $this->baseURL . '/' . $appId;
  76. $ret = $this->get($url);
  77. return $ret;
  78. }
  79. /*
  80. * appId: app 的唯一标识,创建的时候由系统生成
  81. */
  82. public function deleteApp($appId)
  83. {
  84. $url = $this->baseURL . '/' . $appId;
  85. list(, $err) = $this->delete($url);
  86. return $err;
  87. }
  88. /*
  89. * 获取房间的人数
  90. * appId: app 的唯一标识,创建的时候由系统生成。
  91. * roomName: 操作所查询的连麦房间。
  92. */
  93. public function listUser($appId, $roomName)
  94. {
  95. $url = sprintf("%s/%s/rooms/%s/users", $this->baseURL, $appId, $roomName);
  96. $ret = $this->get($url);
  97. return $ret;
  98. }
  99. /*
  100. * 踢出玩家
  101. * appId: app 的唯一标识,创建的时候由系统生成。
  102. * roomName: 连麦房间
  103. * userId: 请求加入房间的用户ID
  104. */
  105. public function kickUser($appId, $roomName, $userId)
  106. {
  107. $url = sprintf("%s/%s/rooms/%s/users/%s", $this->baseURL, $appId, $roomName, $userId);
  108. list(, $err) = $this->delete($url);
  109. return $err;
  110. }
  111. /*
  112. * 获取房间的人数
  113. * appId: app 的唯一标识,创建的时候由系统生成。
  114. * prefix: 所查询房间名的前缀索引,可以为空。
  115. * offset: int 类型,分页查询的位移标记。
  116. * limit: int 类型,此次查询的最大长度。
  117. * GET /v3/apps/<AppID>/rooms?prefix=<RoomNamePrefix>&offset=<Offset>&limit=<Limit>
  118. */
  119. public function listActiveRooms($appId, $prefix = null, $offset = null, $limit = null)
  120. {
  121. if (isset($prefix)) {
  122. $query['prefix'] = $prefix;
  123. }
  124. if (isset($offset)) {
  125. $query['offset'] = $offset;
  126. }
  127. if (isset($limit)) {
  128. $query['limit'] = $limit;
  129. }
  130. if (isset($query) && !empty($query)) {
  131. $query = '?' . http_build_query($query);
  132. $url = sprintf("%s/%s/rooms%s", $this->baseURL, $appId, $query);
  133. } else {
  134. $url = sprintf("%s/%s/rooms", $this->baseURL, $appId);
  135. }
  136. $ret = $this->get($url);
  137. return $ret;
  138. }
  139. /*
  140. * appId: app 的唯一标识,创建的时候由系统生成。
  141. * roomName: 房间名称,需满足规格 ^[a-zA-Z0-9_-]{3,64}$
  142. * userId: 请求加入房间的用户 ID,需满足规格 ^[a-zA-Z0-9_-]{3,50}$
  143. * expireAt: int64 类型,鉴权的有效时间,传入以秒为单位的64位Unix
  144. 绝对时间,token 将在该时间后失效。
  145. * permission: 该用户的房间管理权限,"admin" 或 "user",默认为 "user" 。
  146. 当权限角色为 "admin" 时,拥有将其他用户移除出房间等特权.
  147. */
  148. public function appToken($appId, $roomName, $userId, $expireAt, $permission)
  149. {
  150. $params['appId'] = $appId;
  151. $params['userId'] = $userId;
  152. $params['roomName'] = $roomName;
  153. $params['permission'] = $permission;
  154. $params['expireAt'] = $expireAt;
  155. $appAccessString = json_encode($params);
  156. return $this->auth->signWithData($appAccessString);
  157. }
  158. private function get($url, $cType = null)
  159. {
  160. $rtcToken = $this->auth->authorizationV2($url, "GET", null, $cType);
  161. $rtcToken['Content-Type'] = $cType;
  162. $ret = Client::get($url, $rtcToken);
  163. if (!$ret->ok()) {
  164. return array(null, new Error($url, $ret));
  165. }
  166. return array($ret->json(), null);
  167. }
  168. private function delete($url, $contentType = 'application/json')
  169. {
  170. $rtcToken = $this->auth->authorizationV2($url, "DELETE", null, $contentType);
  171. $rtcToken['Content-Type'] = $contentType;
  172. $ret = Client::delete($url, $rtcToken);
  173. if (!$ret->ok()) {
  174. return array(null, new Error($url, $ret));
  175. }
  176. return array($ret->json(), null);
  177. }
  178. private function post($url, $body, $contentType = 'application/json')
  179. {
  180. $rtcToken = $this->auth->authorizationV2($url, "POST", $body, $contentType);
  181. $rtcToken['Content-Type'] = $contentType;
  182. $ret = Client::post($url, $body, $rtcToken);
  183. if (!$ret->ok()) {
  184. return array(null, new Error($url, $ret));
  185. }
  186. $r = ($ret->body === null) ? array() : $ret->json();
  187. return array($r, null);
  188. }
  189. }