騰訊云上提供兩種直播模式:
一沦泌、直播碼模式
二蛔六、頻道托管模式
這次我們采用第一種模式進(jìn)行接入轴捎,閑話不多說(shuō)了,讓我們開(kāi)始接入吧百炬。
直播碼模式流程如下:
創(chuàng)建推流地址/觀看地址-》內(nèi)容提供者進(jìn)行推流-》客戶端進(jìn)行觀看褐隆。
現(xiàn)在我們從頭開(kāi)始操作:
1。創(chuàng)建推流地址剖踊。
官網(wǎng)上給出的demo很清晰庶弃。這里我們需要用到bizId/防盜鏈安全key衫贬。
創(chuàng)建推流地址首先要?jiǎng)?chuàng)建唯一的直播標(biāo)示碼channel_id.這個(gè)標(biāo)識(shí)碼建議采用時(shí)間戳或相關(guān)可逆的參數(shù)進(jìn)行拼接
例子:
// 生成直播碼
$steamId= Live::setStreamId($user['uid'].time());
這里我是采用當(dāng)前直播的用戶拼接上當(dāng)前的Unix時(shí)間戳.進(jìn)行拼接.
創(chuàng)建完直播標(biāo)識(shí)碼后,就可以采用官網(wǎng)給出的例子進(jìn)行生產(chǎn),無(wú)腦操作.
貼下官網(wǎng)的生成地址:https://www.qcloud.com/document/product/267/7977
生成完推流地址,就可以進(jìn)行直播了.為了更加方便進(jìn)行測(cè)試,會(huì)在本機(jī)搭建一個(gè)直播環(huán)境(我也是主播了哦)
小編是mac系統(tǒng),就以mac系統(tǒng)為例,所使用的工具都包含各種平臺(tái).
1.安裝直播工具.OBS安裝
這個(gè)工具是免費(fèi)的推流工具,可以進(jìn)行屏幕直播,攝像頭等等.具體功能就不具體說(shuō)明了.
安裝完畢后進(jìn)行設(shè)置推流地址設(shè)置:
這里需要注意的是推流地址需要拆分為兩部分.
設(shè)置完推流后.就需要設(shè)置直播方式
這里有很多視頻捕捉方式,就是直播方式.任君選擇,選擇完畢之后開(kāi)始推流`.就開(kāi)始直播啦``
需要播放直播需要額外下載其他播放器小編用的是VLC.
直播流程就到這結(jié)束了,剩下就是等待服務(wù)器的消息推送.
以下是小編封裝的直播相關(guān)的接口.
/**
* 直播操作類
* User: tom
* Date: 17/3/27
* Time: 09:16
*/
classLive {
// 直播統(tǒng)計(jì)基礎(chǔ)url
private static$statBaseUrl='http://statcgi.video.qcloud.com/common_access';
// 查詢基礎(chǔ)url
private static$queryBaseUrl='http://fcgi.video.qcloud.com/common_access';
// 騰訊相關(guān)信息
private static$apiKey='';
// 防盜鏈
private static$safetyKey='';
private static$apiId='';
// 請(qǐng)求的過(guò)期時(shí)間
private static$expireTime=1;
private static$bizId='';
private static$livecode='';
/**
* 獲取直播統(tǒng)計(jì)信息
*@paramstring $steamId
*@paramstring $type all=所有信息,push=推流信息,play=播放信息
*@paramint $pageIndex
*@paramint $pageSize
*@returnmixed
*/
public static functiongetLiveStat($steamId='',$type='all',$pageIndex=1,$pageSize=300){
// 統(tǒng)計(jì)接口
$statInterfaceArr=array('all'=>'Get_LiveStat','push'=>'Get_LivePushStat','play'=>'Get_LivePlayStat');
// 默認(rèn)為統(tǒng)計(jì)所有信息
if(! in_array($type,$statInterfaceArr))
$type='all';
// 請(qǐng)求基本信息
$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);
}
/**
* 查詢直播狀態(tài)
*@param$steamId
*@returnmixed
*/
public static functiongetSteamStatus($steamId){
// 請(qǐng)求基本信息
$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);
}
/**
* 設(shè)置直播的狀態(tài)
*@param$steamId
*@paramint $status 0=關(guān)閉,1=開(kāi)啟
*@returnmixed
*/
public static functionsetLiveStatus($steamId,$status=0){
// 可設(shè)置狀態(tài)必須為0關(guān)閉,1開(kāi)啟
$status= in_array($status,array(0,1)) ?$status:0;
// 請(qǐng)求基本信息
$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'){
// 請(qǐng)求基本信息
$action=array(
'cmd'=>self::$apiId,
'interface'=>'Live_Tape_GetFilelist',
'Param.s.channel_id'=>$steamId,
);
// 開(kāi)始結(jié)束時(shí)間未填的時(shí)候默認(rèn)獲取昨天的數(shù)據(jù)
$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){
// 請(qǐng)求基本信息
$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表示開(kāi)啟歇攻,3表示關(guān)閉
*@paramint $pageIndex
*@paramint $pageSize
*@paramstring $orderBy
*@paramstring $orderField
*@returnmixed
*/
public static functiongetChannelList($status='',$pageIndex=1,$pageSize=10,$orderBy='desc',$orderField='create_time'){
// 請(qǐng)求基本信息
$action=array(
'cmd'=>self::$apiId,
'interface'=>'Live_Channel_GetChannelList'
);
// 默認(rèn)為不過(guò)濾,過(guò)濾條件為0表示斷流固惯,1表示開(kāi)啟,3表示關(guān)閉
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);
}
/**
* 設(shè)置直播碼
*@param$streamId
*@returnstring
*/
public static functionsetStreamId($streamId){
self::$livecode=self::$bizId."_".$streamId;//直播碼
return self::$livecode;
}
/**
* 獲取推流地址
* 如果不傳key和過(guò)期時(shí)間掉伏,將返回不含防盜鏈的url
*@param$bizId 您在騰訊云分配到的bizid
*@param$streamId 您用來(lái)區(qū)別不通推流地址的唯一id
*@param$key 安全密鑰
*@param$time 過(guò)期時(shí)間 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 您用來(lái)區(qū)別不通推流地址的唯一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);
}
/**
* 請(qǐng)求
*@param$url
*@returnmixed
*/
private static function_query($url){
$str=curl_get($url);
$res=json_decode($str,true);
return$res;
}
}