腾讯云上提供两种直播模式:
一、直播码模式
二、频道托管模式
这次我们采用第一种模式进行接入,闲话不多说了,让我们开始接入吧。
直播码模式流程如下:
创建推流地址/观看地址-》内容提供者进行推流-》客户端进行观看。
现在我们从头开始操作:
1。创建推流地址。
官网上给出的demo很清晰。这里我们需要用到bizId/防盗链安全key。
创建推流地址首先要创建唯一的直播标示码channel_id.这个标识码建议采用时间戳或相关可逆的参数进行拼接
例子:
// 生成直播码
$steamId= Live::setStreamId($user['uid'].time());
这里我是采用当前直播的用户拼接上当前的Unix时间戳.进行拼接.
创建完直播标识码后,就可以采用官网给出的例子进行生产,无脑操作.
贴下官网的生成地址:https://www.qcloud.com/document/product/267/7977
生成完推流地址,就可以进行直播了.为了更加方便进行测试,会在本机搭建一个直播环境(我也是主播了哦)
小编是mac系统,就以mac系统为例,所使用的工具都包含各种平台.
1.安装直播工具.OBS安装
这个工具是免费的推流工具,可以进行屏幕直播,摄像头等等.具体功能就不具体说明了.
安装完毕后进行设置推流地址设置:
这里需要注意的是推流地址需要拆分为两部分.
设置完推流后.就需要设置直播方式
这里有很多视频捕捉方式,就是直播方式.任君选择,选择完毕之后开始推流`.就开始直播啦``
需要播放直播需要额外下载其他播放器小编用的是VLC.
直播流程就到这结束了,剩下就是等待服务器的消息推送.
以下是小编封装的直播相关的接口.
/**
* 直播操作类
* User: tom
* Date: 17/3/27
* Time: 09:16
*/
classLive {
// 直播统计基础url
private static$statBaseUrl='http://statcgi.video.qcloud.com/common_access';
// 查询基础url
private static$queryBaseUrl='http://fcgi.video.qcloud.com/common_access';
// 腾讯相关信息
private static$apiKey='';
// 防盗链
private static$safetyKey='';
private static$apiId='';
// 请求的过期时间
private static$expireTime=1;
private static$bizId='';
private static$livecode='';
/**
* 获取直播统计信息
*@paramstring $steamId
*@paramstring $type all=所有信息,push=推流信息,play=播放信息
*@paramint $pageIndex
*@paramint $pageSize
*@returnmixed
*/
public static functiongetLiveStat($steamId='',$type='all',$pageIndex=1,$pageSize=300){
// 统计接口
$statInterfaceArr=array('all'=>'Get_LiveStat','push'=>'Get_LivePushStat','play'=>'Get_LivePlayStat');
// 默认为统计所有信息
if(! in_array($type,$statInterfaceArr))
$type='all';
// 请求基本信息
$action=array(
'cmd'=>self::$apiId,
'interface'=>$statInterfaceArr[$type],
'Param.n.page_no'=>$pageIndex,
'Param.n.page_size'=>$pageSize
);
// 是否存在制定的直播流id
if($steamId)
$action['Param.s.stream_id'] =$steamId;
// 组装url
$action= array_merge(self::_commonParam(self::$expireTime),$action);
$url=self::$statBaseUrl.'?'.http_build_query($action);
return self::_query($url);
}
/**
* 查询直播状态
*@param$steamId
*@returnmixed
*/
public static functiongetSteamStatus($steamId){
// 请求基本信息
$action=array(
'cmd'=>self::$apiId,
'interface'=>'Live_Channel_GetStatus',
'Param.s.channel_id'=>$steamId
);
// 组装url
$action= array_merge(self::_commonParam(self::$expireTime),$action);
$url=self::$queryBaseUrl.'?'.http_build_query($action);
return self::_query($url);
}
/**
* 设置直播的状态
*@param$steamId
*@paramint $status 0=关闭,1=开启
*@returnmixed
*/
public static functionsetLiveStatus($steamId,$status=0){
// 可设置状态必须为0关闭,1开启
$status= in_array($status,array(0,1)) ?$status:0;
// 请求基本信息
$action=array(
'cmd'=>self::$apiId,
'interface'=>'Live_Channel_SetStatus',
'Param.s.channel_id'=>$steamId,
'Param.n.status'=>$status
);
// 组装url
$action= array_merge(self::_commonParam(self::$expireTime),$action);
$url=self::$queryBaseUrl.'?'.http_build_query($action);
return self::_query($url);
}
/**
* 查询直播录制列表
*@param$steamId
*@paramstring $startTime
*@paramstring $endTime
*@paramint $pageIndex
*@paramint $pageSize
*@paramstring $orderBy
*@returnmixed
*/
public static functiongetRecordList($steamId,$startTime='',$endTime='',$pageIndex=1,$pageSize=10,$orderBy='desc'){
// 请求基本信息
$action=array(
'cmd'=>self::$apiId,
'interface'=>'Live_Tape_GetFilelist',
'Param.s.channel_id'=>$steamId,
);
// 开始结束时间未填的时候默认获取昨天的数据
$action['Param.s.start_time'] = !empty($startTime) ?$startTime: date('Y-m-d 00:00:00',strtotime('-1 day'));
$action['Param.s.end_time'] = !empty($endTime) ?$endTime: date('Y-m-d 00::00',time());
$action['Param.s.sort_type'] =$orderBy;
$action['Param.n.page_no'] =$pageIndex;
$action['Param.n.page_size'] =$pageSize;
// 组装url
$action= array_merge(self::_commonParam(self::$expireTime),$action);
$url=self::$queryBaseUrl.'?'.http_build_query($action);
return self::_query($url);
}
/**
* 查询直播的截图
*@param$queueId
*@paramint $count
*@returnmixed
*/
public static functiongetLivePic($queueId,$count=10){
// 请求基本信息
$action=array(
'cmd'=>self::$apiId,
'interface'=>'Live_Queue_Get',
'Param.n.bid'=>$queueId,
'Param.n.count'=>$count
);
// 组装url
$action= array_merge(self::_commonParam(self::$expireTime),$action);
$url=self::$queryBaseUrl.'?'.http_build_query($action);
return self::_query($url);
}
/**
* 获取频道列表
*@paramstring $status 0表示断流,1表示开启,3表示关闭
*@paramint $pageIndex
*@paramint $pageSize
*@paramstring $orderBy
*@paramstring $orderField
*@returnmixed
*/
public static functiongetChannelList($status='',$pageIndex=1,$pageSize=10,$orderBy='desc',$orderField='create_time'){
// 请求基本信息
$action=array(
'cmd'=>self::$apiId,
'interface'=>'Live_Channel_GetChannelList'
);
// 默认为不过滤,过滤条件为0表示断流,1表示开启,3表示关闭
if($status)
$action['Param.n.status'] =$status;
$action['Param.s.order_field'] =$orderField;
$action['Param.s.sort_type'] =$orderBy;
$action['Param.n.page_no'] =$pageIndex;
$action['Param.n.page_size'] =$pageSize;
// 组装url
$action= array_merge(self::_commonParam(self::$expireTime),$action);
$url=self::$queryBaseUrl.'?'.http_build_query($action);
return self::_query($url);
}
/**
* 设置直播码
*@param$streamId
*@returnstring
*/
public static functionsetStreamId($streamId){
self::$livecode=self::$bizId."_".$streamId;//直播码
return self::$livecode;
}
/**
* 获取推流地址
* 如果不传key和过期时间,将返回不含防盗链的url
*@param$bizId 您在腾讯云分配到的bizid
*@param$streamId 您用来区别不通推流地址的唯一id
*@param$key 安全密钥
*@param$time 过期时间 sample 2016-11-12 12:00:00
*@returnString url
*/
public static functiongetPushUrl($time=null){
if($time){
$txTime= strtoupper(base_convert(strtotime($time),10,16));
//txSecret = MD5( KEY + livecode + txTime )
//livecode = bizid+"_"+stream_id 如 8888_test123456
$txSecret= md5(self::$safetyKey.self::$livecode.$txTime);
$ext_str="?".http_build_query(array(
"bizid"=>self::$bizId,
"txSecret"=>$txSecret,
"txTime"=>$txTime
));
}
return"rtmp://".self::$bizId.".livepush.myqcloud.com/live/".self::$livecode.(isset($ext_str) ?$ext_str:"");
}
/**
* 获取播放地址
*@param$bizId 您在腾讯云分配到的bizid
*@param$streamId 您用来区别不通推流地址的唯一id
*@returnString url
*/
public static functiongetPlayUrl(){
return array(
'rtmp'=>"rtmp://".self::$bizId.".liveplay.myqcloud.com/live/".self::$livecode,
'flv'=>"http://".self::$bizId.".liveplay.myqcloud.com/live/".self::$livecode.".flv",
'hls'=>"http://".self::$bizId.".liveplay.myqcloud.com/live/".self::$livecode.".m3u8"
);
}
/**
* 生成公用的配置部分
*@paramint $expireTime
*@returnarray
*/
private static function_commonParam($expireTime=1){
$t= strtotime("+{$expireTime}minute");
$sign= md5(self::$apiKey.$t);
return array('t'=>$t,'sign'=>$sign);
}
/**
* 请求
*@param$url
*@returnmixed
*/
private static function_query($url){
$str=curl_get($url);
$res=json_decode($str,true);
return$res;
}
}