Hub.php 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  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. $marker = $ret["marker"];
  61. $ret = array();
  62. $ret["keys"] = $keys;
  63. $ret["omarker"] = $marker;
  64. return $ret;
  65. }
  66. //根据 prefix 遍历 Hub 的正在直播的流列表.
  67. /*
  68. * PARAM
  69. * @prefix: 流名的前缀.
  70. * @limit: 限定了一次最多可以返回的流个数, 实际返回的流个数可能小于这个 limit 值.
  71. * @marker: 是上一次遍历得到的流标.
  72. * RETURN
  73. * @keys: 流名的数组.
  74. * @omarker: 记录了此次遍历到的游标, 在下次请求时应该带上, 如果 omarker 为 "" 表示已经遍历完所有流.
  75. */
  76. public function listLiveStreams($prefix, $limit, $marker)
  77. {
  78. return $this->_list("true", $prefix, $limit, $marker);
  79. }
  80. //根据 prefix 遍历 Hub 的流列表.
  81. /*
  82. * PARAM
  83. * @prefix: 流名的前缀.
  84. * @limit: 限定了一次最多可以返回的流个数, 实际返回的流个数可能小于这个 limit 值.
  85. * @marker: 是上一次遍历得到的流标.
  86. * RETURN
  87. * @keys: 流名的数组.
  88. * @omarker: 记录了此次遍历到的游标, 在下次请求时应该带上, 如果 omarker 为 "" 表示已经遍历完所有流.
  89. */
  90. public function listStreams($prefix, $limit, $marker)
  91. {
  92. return $this->_list("false", $prefix, $limit, $marker);
  93. }
  94. //批量查询流直播信息.
  95. /*
  96. * PARAM
  97. * @streamKeys: 流名数组, 最大长度为100.
  98. * RETURN
  99. * @items: 数组. 每个item包含一个流的直播信息.
  100. * @key: 流名.
  101. * @startAt: 直播开始的 Unix 时间戳, 0 表示当前没在直播.
  102. * @clientIP: 直播的客户端 IP.
  103. * @bps: 直播的码率.
  104. * @fps: 直播的帧率.
  105. */
  106. public function batchLiveStatus($streamKeys)
  107. {
  108. $url = $this->_baseURL . "/livestreams";
  109. $params['items'] = $streamKeys;
  110. $body = json_encode($params);
  111. return $this->_transport->send(HttpRequest::POST, $url, $body);
  112. }
  113. }
  114. //----------------url
  115. //生成 RTMP 推流地址.
  116. //expireAfterSeconds 表示 URL 在多久之后失效.
  117. function RTMPPublishURL($domain, $hub, $streamKey, $expireAfterSeconds, $accessKey, $secretKey)
  118. {
  119. $expire = time() + $expireAfterSeconds;
  120. $path = sprintf("/%s/%s?e=%d", $hub, $streamKey, $expire);
  121. $token = $accessKey . ":" . Utils::sign($secretKey, $path);
  122. return sprintf("rtmp://%s%s&token=%s", $domain, $path, $token);
  123. }
  124. //生成 RTMP 直播地址.
  125. function RTMPPlayURL($domain, $hub, $streamKey)
  126. {
  127. return sprintf("rtmp://%s/%s/%s", $domain, $hub, $streamKey);
  128. }
  129. //生成 HLS 直播地址.
  130. function HLSPlayURL($domain, $hub, $streamKey)
  131. {
  132. return sprintf("http://%s/%s/%s.m3u8", $domain, $hub, $streamKey);
  133. }
  134. //生成 HDL 直播地址.
  135. function HDLPlayURL($domain, $hub, $streamKey)
  136. {
  137. return sprintf("http://%s/%s/%s.flv", $domain, $hub, $streamKey);
  138. }
  139. //生成直播封面地址.
  140. function SnapshotPlayURL($domain, $hub, $streamKey)
  141. {
  142. return sprintf("http://%s/%s/%s.jpg", $domain, $hub, $streamKey);
  143. }