Hub.php 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. <?php
  2. namespace Qiniu\Pili;
  3. use \Qiniu\Pili\HttpRequest;
  4. use \Qiniu\Pili\Utils;
  5. class Hub
  6. {
  7. private $_hub;
  8. private $_baseURL;
  9. private $_transport;
  10. public function __construct($mac, $hubName)
  11. {
  12. $this->_hub = $hubName;
  13. $this->_transport = new Transport($mac);
  14. $cfg = Config::getInstance();
  15. $protocal = $cfg->USE_HTTPS === true ? "https" : "http";
  16. $this->_baseURL = $protocal . "://" . $cfg->API_HOST . "/v2/hubs/" . $this->_hub;
  17. }
  18. //创建一个流对象.
  19. /*
  20. * PARAM
  21. * @streamKey: 流名.
  22. * RETURN
  23. * 返回一个流对象.
  24. */
  25. public function create($streamKey)
  26. {
  27. $url = $this->_baseURL . "/streams";
  28. $params['key'] = $streamKey;
  29. $body = json_encode($params);
  30. try {
  31. $this->_transport->send(HttpRequest::POST, $url, $body);
  32. } catch (\Exception $e) {
  33. return $e;
  34. }
  35. return new Stream($this->_transport, $this->_hub, $streamKey);
  36. }
  37. //初始化一个流对象
  38. /*
  39. * PARAM
  40. * @streamKey: 流名.
  41. * RETURN
  42. * 返回一个流对象.
  43. */
  44. public function stream($streamKey)
  45. {
  46. return new Stream($this->_transport, $this->_hub, $streamKey);
  47. }
  48. private function _list($live, $prefix, $limit, $marker)
  49. {
  50. $url = sprintf("%s/streams?liveonly=%s&prefix=%s&limit=%d&marker=%s", $this->_baseURL, $live, $prefix, $limit, $marker);
  51. try {
  52. $ret = $this->_transport->send(HttpRequest::GET, $url);
  53. } catch (\Exception $e) {
  54. return $e;
  55. }
  56. $keys = array();
  57. foreach ($ret["items"] as $item) {
  58. array_push($keys, $item["key"]);
  59. }
  60. $ret = array();
  61. $ret["keys"] = $keys;
  62. $ret["omarker"] = $marker;
  63. return $ret;
  64. }
  65. //根据 prefix 遍历 Hub 的正在直播的流列表.
  66. /*
  67. * PARAM
  68. * @prefix: 流名的前缀.
  69. * @limit: 限定了一次最多可以返回的流个数, 实际返回的流个数可能小于这个 limit 值.
  70. * @marker: 是上一次遍历得到的流标.
  71. * RETURN
  72. * @keys: 流名的数组.
  73. * @omarker: 记录了此次遍历到的游标, 在下次请求时应该带上, 如果 omarker 为 "" 表示已经遍历完所有流.
  74. */
  75. public function listLiveStreams($prefix, $limit, $marker)
  76. {
  77. return $this->_list("true", $prefix, $limit, $marker);
  78. }
  79. //根据 prefix 遍历 Hub 的流列表.
  80. /*
  81. * PARAM
  82. * @prefix: 流名的前缀.
  83. * @limit: 限定了一次最多可以返回的流个数, 实际返回的流个数可能小于这个 limit 值.
  84. * @marker: 是上一次遍历得到的流标.
  85. * RETURN
  86. * @keys: 流名的数组.
  87. * @omarker: 记录了此次遍历到的游标, 在下次请求时应该带上, 如果 omarker 为 "" 表示已经遍历完所有流.
  88. */
  89. public function listStreams($prefix, $limit, $marker)
  90. {
  91. return $this->_list("false", $prefix, $limit, $marker);
  92. }
  93. //批量查询流直播信息.
  94. /*
  95. * PARAM
  96. * @streamKeys: 流名数组, 最大长度为100.
  97. * RETURN
  98. * @items: 数组. 每个item包含一个流的直播信息.
  99. * @key: 流名.
  100. * @startAt: 直播开始的 Unix 时间戳, 0 表示当前没在直播.
  101. * @clientIP: 直播的客户端 IP.
  102. * @bps: 直播的码率.
  103. * @fps: 直播的帧率.
  104. */
  105. public function batchLiveStatus($streamKeys)
  106. {
  107. $url = $this->_baseURL . "/livestreams";
  108. $params['items'] = $streamKeys;
  109. $body = json_encode($params);
  110. return $this->_transport->send(HttpRequest::POST, $url, $body);
  111. }
  112. }
  113. //----------------url
  114. //生成 RTMP 推流地址.
  115. //expireAfterSeconds 表示 URL 在多久之后失效.
  116. function RTMPPublishURL($domain, $hub, $streamKey, $expireAfterSeconds, $accessKey, $secretKey)
  117. {
  118. $expire = time() + $expireAfterSeconds;
  119. $path = sprintf("/%s/%s?e=%d", $hub, $streamKey, $expire);
  120. $token = $accessKey . ":" . Utils::sign($secretKey, $path);
  121. return sprintf("rtmp://%s%s&token=%s", $domain, $path, $token);
  122. }
  123. //生成 RTMP 直播地址.
  124. function RTMPPlayURL($domain, $hub, $streamKey)
  125. {
  126. return sprintf("rtmp://%s/%s/%s", $domain, $hub, $streamKey);
  127. }
  128. //生成 HLS 直播地址.
  129. function HLSPlayURL($domain, $hub, $streamKey)
  130. {
  131. return sprintf("http://%s/%s/%s.m3u8", $domain, $hub, $streamKey);
  132. }
  133. //生成 HDL 直播地址.
  134. function HDLPlayURL($domain, $hub, $streamKey)
  135. {
  136. return sprintf("http://%s/%s/%s.flv", $domain, $hub, $streamKey);
  137. }
  138. //生成直播封面地址.
  139. function SnapshotPlayURL($domain, $hub, $streamKey)
  140. {
  141. return sprintf("http://%s/%s/%s.jpg", $domain, $hub, $streamKey);
  142. }
  143. ?>