当前位置:   article > 正文

PHP+阿里云直播功能_alibabacloud/live

alibabacloud/live

转载地址:PHP+阿里云直播功能_帝在哭泣!的博客-CSDN博客_php实现直播功能

前提条件
已注册阿里云账号,注册流程请参见注册阿里云账号。
账号已进行实名认证,实名认证流程请参见个人实名认证或企业实名认证。
准备2个已完成备案的域名,备案流程请参见备案。
若您要添加的推流域名和播流域名,是同一个一级域名下的两个二级域名,则只需要将一级域名进行备案即可。
步骤如下
1.添加推流域名和播流域名

 2.配置CNAME解析

 3. 关联推流和播流

在域名管理页面,选择您添加的播流域名,单击域名配置。
进入直播管理 > 基本配置页面,单击基础信息页签。
在此页面,您可以查看该域名的CNAME、创建时间、业务类型、直播中心、加速区域。

单击推流信息页签。
单击添加推流信息或推流域名后的编辑图标,选择需要关联的推流域名,并单击确定。
4.(可选)配置自定义鉴权(可选)

在视频直播控制台左侧导航栏,单击域名管理,进入域名管理页面。
选择您要配置的播流域名,单击域名配置。
单击直播管理 > 访问控制,并选择URL鉴权页签,单击修改配置。
配置URL鉴权信息,单击确定。
配置项和说明如下表所示。

5.生成推流地址和播流地址

进入工具箱 > 地址生成器页面。
选择播流域名及其关联的推流域名。
输入AppName和StreamName。
根据实际需求选择转码模版。
6.推流和播放

推流是把采集阶段封装好的音视频直播流推送到阿里云直播服务中心的过程。播放是将直播服务中心已有直播内容分发到播放器进行播放的过程。以下内容以PC端OBS推流插件Demo(OBS为第三方工具,插件由视频直播提供)、PC端播放工具VLC(VLC为第三方工具)、阿里云直播(视频直播Demo应用)以及阿里云Web播放器为例,指引您完成推流与播放操作。

阿里云官方文档:快速入门 - 视频直播 - 阿里云

7. PHP 代码实现

7.1   SDK下载   composer require alibabacloud/live

7. 2  实现代码

  1. <?php
  2.  
  3. namespace App\Server;
  4.  
  5. use App\Http\Controllers\Controller;
  6. use Illuminate\Http\Request;
  7. use AlibabaCloud\Client\AlibabaCloud;
  8. use AlibabaCloud\Client\Exception\ClientException;
  9. use AlibabaCloud\Client\Exception\ServerException;
  10.  
  11. class LiveA extends Controller
  12. {
  13.     private $error;
  14.     const DOMAIN_NAME='';//你的加速域名,和推流域名一致。
  15.     const REGION_ID='cn-shanghai';//区域
  16.     const ACCESS_KEY_ID='';//阿里云秘钥
  17.     const ACCESS_KEY_SECRET='';//阿里云秘钥
  18.     const LIVE_HOST='live.aliyuncs.com';//写死,阿里云直播CDN域名
  19.     const ALIVE_URL='';//推域名
  20.     const ALIVE_KEY='';        //推流鉴权KEY,后台拿
  21.     const TLIVE_URL='';//关联的播域名
  22.     const TLIVE_KEY='';    //播流鉴权KEY,后台拿
  23.  
  24.     /**
  25.      * 创建签名
  26.      * @param $path 播放地址 域名后面所有
  27.      * @param $exp //结束时间
  28.      * @param $key
  29.      * @return string
  30.      */
  31.     private static function createSign($path,$exp,$key)
  32.     {
  33.         $rand=0;
  34.         $uid=0;
  35.         $str=sprintf("%s-%s-%s-%s-%s",$path,(string)$exp,(string)$rand,(string)$uid,$key);
  36.         $hashValue=md5($str);
  37.         $authKey=sprintf("%s-%s-%s-%s",(string)$exp,(string)$rand,(string)$uid,$hashValue);
  38.         return "auth_key=$authKey";
  39.     }
  40.  
  41.     /**
  42.      * 创建是直播地址
  43.      * @param $appName 应用名称 ,自定义
  44.      * @param $streamName 房间名称,自定义,该应用下唯一
  45.      * @param $endTime 结束时间
  46.      * @return array|bool  播放流(观看者):alive_url,推流(直播者):tlive_url
  47.      */
  48.     public static function createdLive($appName,$streamName,$endTime)
  49.     {
  50.         if(!$appName || !$streamName || !$endTime || $endTime < time()){
  51.             return false;
  52.         }
  53.         //创建播流
  54.         $path="/$appName/$streamName";
  55.         $aliveUrl='rtmp://'.self::ALIVE_URL."$path?".self::createSign($path,$endTime,self::ALIVE_KEY);
  56.  
  57.         //创建推流
  58.         $rtmp_sstring = '/'.$appName.'/'.$streamName.'-'.$endTime.'-0-0-'.self::TLIVE_KEY;
  59.         $rtmp_md5hash = md5($rtmp_sstring);
  60.         $rtmp_play_url = 'rtmp://'.self::TLIVE_URL.'/'.$appName.'/'.$streamName.'?auth_key='.$endTime.'-0-0-'.$rtmp_md5hash;
  61.  
  62.         $flv_sstring = '/'.$appName.'/'.$streamName.'.flv-'.$endTime.'-0-0-'.self::TLIVE_KEY;
  63.         $flv_md5hash = md5($flv_sstring);
  64.         $flv_play_url = 'http://'.self::TLIVE_URL.'/'.$appName.'/'.$streamName.'.flv?auth_key='.$endTime.'-0-0-'.$flv_md5hash;
  65.  
  66.         $hls_sstring = '/'.$appName.'/'.$streamName.'.m3u8-'.$endTime.'-0-0-'.self::TLIVE_KEY;
  67.         $hls_md5hash = md5($hls_sstring);
  68.         $tliveUrlM3U8 = 'http://'.self::TLIVE_URL.'/'.$appName.'/'.$streamName.'.m3u8?auth_key='.$endTime.'-0-0-'.$hls_md5hash;
  69.         $data = [
  70.             'rtmp'=>$rtmp_play_url,
  71.             'flv'=>$flv_play_url,
  72.             'hls'=>$tliveUrlM3U8,
  73.         ];
  74.         return [
  75.             'alive_url'=>$aliveUrl,
  76.             'tlive_url'=>$data,
  77.         ];
  78.     }
  79.     //停止直播
  80.     public static function stopLive($appName,$streamName)
  81.     {
  82.         $query=[
  83.             'RegionId' => self::REGION_ID,
  84.             'AppName' => $appName,
  85.             'StreamName' => $streamName,
  86.             'LiveStreamType' => "publisher",
  87.             'DomainName' => self::DOMAIN_NAME,
  88.             // 'ResumeTime'=>'',
  89.         ];
  90.         $_this=new static();
  91.         $result=$_this->request('ForbidLiveStream',$query);
  92.         return $result;
  93.     }
  94.     //恢复直播
  95.     public static function resumeLive($appName,$streamName)
  96.     {
  97.         $query=[
  98.             'RegionId' => self::REGION_ID,
  99.             'LiveStreamType' => "publisher",
  100.             'AppName' => $appName,
  101.             'StreamName' => $streamName,
  102.             'DomainName' => self::DOMAIN_NAME,
  103.         ];
  104.         $_this=new static();
  105.         $result=$_this->request('ResumeLiveStream',$query);
  106.         return $result;
  107.     }
  108.     //获取直播在线人数
  109.     public static function getOnlineUserNum($appName,$streamNma)
  110.     {
  111.         $query=[
  112.             'RegionId' => self::REGION_ID,
  113.             'DomainName' => self::DOMAIN_NAME,
  114.             'AppName'=>$appName,
  115.             'StreamName' =>$streamNma,
  116.         ];
  117.         $_this=new static();
  118.         $result=$_this->request('DescribeLiveStreamOnlineUserNum',$query);
  119.         return $result;
  120.     }
  121.     //获取错误
  122.     public static function getError()
  123.     {
  124.         return (new static())->error;
  125.     }
  126.     //请求
  127.     private function request($action,Array $query)
  128.     {
  129.         AlibabaCloud::accessKeyClient(self::ACCESS_KEY_ID, self::ACCESS_KEY_SECRET)
  130.             ->regionId(self::REGION_ID)
  131.             ->asDefaultClient();
  132.         try {
  133.             $result = AlibabaCloud::rpc()
  134.                 ->product('live')
  135.                  ->scheme('https') // https | http
  136.                 ->version('2016-11-01')
  137.                 ->action($action)
  138.                 ->method('POST')
  139.                 ->host(self::LIVE_HOST)
  140.                 ->options([
  141.                     'query' => $query,
  142.                 ])
  143.                 ->request();
  144.             return $result->toArray();
  145.         } catch (ClientException $e) {
  146.             $this->error=$e->getMessage();
  147.             return false;
  148.         } catch (ServerException $e) {
  149.             $this->error=$e->getMessage();
  150.             return false;
  151.         }
  152.     }
  153.  
  154. }


以及 m3u8 的网页播放代码

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4.     <meta charset="utf-8">
  5.     <meta http-equiv="x-ua-compatible" content="IE=edge" >
  6.     <meta name="viewport" content="width=device-width, height=device-height, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no"/>
  7.     <title>Aliplayer Online Settings</title>
  8.     <link rel="stylesheet" href="https://g.alicdn.com/de/prismplayer/2.9.16/skins/default/aliplayer-min.css" />
  9.     <script charset="utf-8" type="text/javascript" src="https://g.alicdn.com/de/prismplayer/2.9.16/aliplayer-min.js"></script>
  10. </head>
  11. <body>
  12. <div class="prism-player" id="player-con"></div>
  13. <script>
  14.     var player = new Aliplayer({
  15.             "id": "player-con",
  16.         //M3U8格式使用
  17.             "source": "http://bo.liyan.shop/447/447.m3u8?auth_key=1644577599-0-0-a44d0cc9d7619a879ccc1328a9aeeb48",
  18.             "width": "100%",
  19.             "height": "500px",
  20.             "autoplay": true,
  21.         //直播参数必须为true
  22.             "isLive": true,
  23.             "rePlay": false,
  24.             "playsinline": true,
  25.             "preload": true,
  26.             "controlBarVisibility": "hover",
  27.             "useH5Prism": true
  28.         }, function (player) {
  29.             console.log("The player is created");
  30.         }
  31.     );
  32. </script>
  33. </body>

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/157603
推荐阅读
  

闽ICP备14008679号