腾讯直播码模式教程

腾讯云上提供两种直播模式:
一、直播码模式
二、频道托管模式
这次我们采用第一种模式进行接入,闲话不多说了,让我们开始接入吧。
直播码模式流程如下:
创建推流地址/观看地址-》内容提供者进行推流-》客户端进行观看。
现在我们从头开始操作:
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;
}
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,398评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,585评论 18 139
  • 绿竹半含箨,新稍才出墙。(手机拍)
    江夏月阅读 121评论 0 0
  • 原本只想收获一枚秋果,他却给了我们整个秋天。 2017年9月4日 星期一 晴 打开忧喜交集的高三日记,总能准确...
    见伊阅读 860评论 88 62
  • 如何做好一套幻灯片? 相信每一个人都有自己的答案,可能你会说,不要用宋体;也可能会说,配图要高清;当然,还有人可能...
    韩国中文老师专家阅读 623评论 0 0