公司新下来了一个需求,为了让更多的企业hr在线看我们公司的“hr沙龙培训活动”(之前一直是到现场听),于是购买了网易云的直播服务,做一个在线直播观看的活动。
购买完成后,输入账号密码,在后台应用中创建我们自己的应用。在创建的应用中,我们手动创建自己的直播频道(这个是可以通过接口用代码完成,我们之所以手动创建,因为我的得推流入口就几个,也是固定的,所以就省了一点力)。如果要用接口来创建,就需要进行接口鉴权。文档上给出的是java示例,我这里给出我的PHP示例,供参考。
class Classwangyiyunzhibo{
private $AppKey; //开发者平台分配的AppKey
private $AppSecret; //开发者平台分配的AppSecret,可刷新
private $Nonce; //随机数(最大长度128个字符)
private $CurTime; //当前UTC时间戳,从1970年1月1日0点0 分0 秒开始到现在的秒数(String)
private $CheckSum; //SHA1(AppSecret + Nonce + CurTime),三个参数拼接的字符串,进行SHA1哈希计算,转化成16进制字符(String,小写)
const HEX_DIGITS = "0123456789abcdef";
public function __construct($AppKey,$AppSecret){
$this->AppKey = $AppKey;
$this->AppSecret = $AppSecret;
}
/**生成验证码**/
public function checkSumBuilder(){
//此部分生成随机字符串
$hex_digits = self::HEX_DIGITS;
$this->Nonce;
for($i=0;$i<128;$i++){ //随机字符串最大128个字符,也可以小于该数
$this->Nonce.= $hex_digits[rand(0,15)];
}
$this->CurTime = (string)(time()); //当前时间戳,以秒为单位
$join_string = $this->AppSecret.$this->Nonce.$this->CurTime;
$this->CheckSum = sha1($join_string);
}
/*****file_get_contents()post请求******/
public function postDataCurl($url='https://vcloud.163.com/app/channellist',$data=array()){
$this->checkSumBuilder(); //发送请求前需先生成checkSum
if(!empty($data)){
$data = json_encode($data);
}else{
$data = "";
}
$options = array(
'http' => array(
'method' => 'POST',
'header' => "Content-Type: application/json;charset=utf-8\r\n"."AppKey:".$this->AppKey."\r\n"."Nonce:".$this->Nonce."\r\n".
"CurTime:".$this->CurTime."\r\n"."CheckSum:".$this->CheckSum."",
'content' => $data,
'timeout' => 500,
)
);
$context = stream_context_create($options);
$result = file_get_contents($url, false, $context);
return json_decode($result,true);
}
/*****curlpost请求******/
// public function postDataCurl($url,$data=array()){
// $this->checkSumBuilder(); //发送请求前需先生成checkSum
// if(!empty($data)){
// $json=json_encode($data);
// }else{
// $json="";
// }
// $timeout = 5000;
// $http_header = array(
// 'AppKey:'.$this->AppKey,
// 'Nonce:'.$this->Nonce,
// 'CurTime:'.$this->CurTime,
// 'CheckSum:'.$this->CheckSum,
// 'Content-Type: application/json;charset=utf-8;',
// 'Content-Length: ' . strlen($json)
// );
// $ch = curl_init();
// curl_setopt ($ch, CURLOPT_URL, $url);
// curl_setopt ($ch, CURLOPT_POST, 1);
// curl_setopt ($ch, CURLOPT_POSTFIELDS, $json);
// curl_setopt ($ch, CURLOPT_HEADER, false);
// curl_setopt ($ch, CURLOPT_HTTPHEADER,$http_header);
// curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER,false);
// curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
// curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
// $result = curl_exec($ch);
// if (false === $result) {
// $result = curl_errno($ch);
// }
// curl_close($ch);
// return json_decode($result,true) ;
// }
/***创建频道***/
public function channel_add($name,$type=0){
$url="https://vcloud.163.com/app/channel/create";
return $data=$this->postDataCurl($url,array("name"=>$name,"type"=>$type));
}
/****修改频道*****/
public function channel_update($name,$cid,$type=0){
$url="https://vcloud.163.com/app/channel/update";
return $data=$this->postDataCurl($url,array("name"=>$name,"cid"=>$cid,"type"=>$type));
}
/****删除频道******/
public function channel_delete($cid){
$url="https://vcloud.163.com/app/channel/delete";
return $data=$this->postDataCurl($url,array("cid"=>$cid));
}
/****获取频道状态******/
public function channel_get($cid){
$url="https://vcloud.163.com/app/channelstats";
return $data=$this->postDataCurl($url,array("cid"=>$cid));
}
/***
获取频道列表
records int 单页记录数,默认值为10 否
pnum int 要取第几页,默认值为1 否
ofield String 排序的域,支持的排序域为:ctime(默认) 否
sort int 升序还是降序,1升序,0降序,默认为desc 否
**/
public function channel_list($option=array("records"=>10,"pnum"=>1,"ofield"=>"ctime","sort"=>1)){
$url="https://vcloud.163.com/app/channellist";
return $data=$this->postDataCurl($url,$option);
}
/**重新获取推流地址***/
public function channel_reset($cid){
$url="https://vcloud.163.com/app/address";
return $data=$this->postDataCurl($url,array("cid"=>$cid));
}
/*****
设置频道为录制状态
cid String 频道ID 是
needRecord int 1-开启录制; 0-关闭录制 是
format int 1-flv; 0-mp4 是
duration int 录制切片时长(分钟),默认120分钟 否
filename String 录制后文件名,格式为filename_YYYYMMDD-HHmmssYYYYMMDD-HHmmss,
文件名录制起始时间(年月日时分秒) -录制结束时间(年月日时分秒) 否
****/
public function channel_setRecord($cid,$option=array()){
$url="https://vcloud.163.com/app/channel/setAlwaysRecord";
return $data=$this->postDataCurl($url,$option);
}
/****禁用频道*****/
public function channel_pause($cid){
$url="https://vcloud.163.com/app/channel/pause";
return $data=$this->postDataCurl($url,array("cid"=>$cid));
}
/****批量禁用频道****/
public function channel_pauselist($cidList){
$url="https://vcloud.163.com/app/channellist/pause";
return $data=$this->postDataCurl($url,array("cidList"=>$cidList));
}
/****恢复频道*****/
public function channel_resume($cid){
$url="https://vcloud.163.com/app/channel/resume";
return $data=$this->postDataCurl($url,array("cid"=>$cid));
}
/****批量恢复频道****/
public function channel_resumelist($cidList){
$url="https://vcloud.163.com/app/channellist/resume";
return $data=$this->postDataCurl($url,array("cidList"=>$cidList));
}
/****获取录制视频文件列表*****/
public function channel_videolist($cid){
$url="https://vcloud.163.com/app/videolist";
return $data=$this->postDataCurl($url,array("cid"=>$cid));
}
/****获取某一时间范围的录制视频文件列表*****/
public function app_vodvideolist($cid,$beginTime,$endTime){
$url="https://vcloud.163.com/app/vodvideolist";
return $data=$this->postDataCurl($url,array("cid"=>$cid,"beginTime"=>$beginTime,"endTime"=>$endTime));
}
/****设置视频录制回调地址*****/
public function record_setcallback($recordClk){
$url="https://vcloud.163.com/app/record/setcallback";
return $data=$this->postDataCurl($url,array("recordClk"=>$recordClk));
}
/****设置回调的加签秘钥*****/
public function callback_setSignKey($signKey){
$url="https://vcloud.163.com/app/callback/setSignKey";
return $data=$this->postDataCurl($url,array("signKey"=>$signKey));
}
/****录制文件合并*****/
public function video_merge($outputName,$vidList){
$url="https://vcloud.163.com/app/video/merge";
return $data=$this->postDataCurl($url,array("outputName"=>$outputName,"vidList"=>$vidList));
}
}
?>
这里实例化的时候需要传入网易云后台分配的Access Key,Access Key拥有所有接口的访问权限.
在我的这个示例里,我给出了两种请求方式,一种file_get_contents()post请求,一种curl的请求方式,我们使用的是前者,因为我们的curl在服务器中一直没有打开,运维给出的理由是不安全。
有了上面这个示例,我们就可以开心的调用网易云提供的所有接口为所欲为了,我们直播的视频也可以录制下来,可以做一个回看功能,让没看到直播的用户进行回看。这个功能很不错,想象的空间很大,可是我的基本功能都做好了,这个功能最后被砍了,不过在这里我也要介绍一下。
在前台直播页面可以说是非常简单的,只需要前端做好页面,把网易云直播提供的js和html代码引入就可以了,不做任何处理就是一个黑窗口,播放窗口上的各种操作,可以默认,也自己定制处理,看业务需求。
我们的直播信息都是在crm后台录入好的,在前台取出当期的数据就可以了。在前台播放需要一个拉流地址,这个在我们创建的频道里面,可以通过接口获取。拉流地址有三个,分别兼容不同的模式,因为我们的需求要求用户用手机访问时也能观看,所以这个也解决了在移动端的兼容性问题,拉流地址有http,hls,rtmp三个模式,我们也不需要判断用户使用的是移动端还是PC端进行观看,我们可以把这三个模式全部写出来,因为网易云直播的播放有一个功能就是检测如果第一个地址不能播放,就依次向下检测其他的播放地址。
有拉流就有推流,推流也很简单,我们可以用网易云提供的demo,只需要把推流地址输入就可以,可以同时利用摄像头直播和直播电脑页面上的操作,两个图像可以叠加在窗口上,自己可以设置窗口的大小。
在直播的时候,我们可以对频道开启录制功能,可以在网易云后台手动开启,也可以利用接口开启。录制好的视频自动保存在网易云后台,可以通过接口获取,我们也可以在后台上传我们自己的视频,也是可以获取到,录制的视频默认格式是flv。
我们这个直播项目只是一个简单的教学直播,没有互动,弹幕的环节,如果你想做这样的直播,那就要购买网易云的另外一个服务了,叫做互动直播,这个功能就很强大了。(完)