앵커와 게임 앵커는 최근 다른 웹 애플리케이션에 비해 매우 인기가 높습니다. 라이브 비디오 스트리밍은 여전히 약간 복잡합니다. FMS를 이용하여 서버를 구축하고 테스트를 해보았으나 아직 라이브 방송이 안정적이지 않습니다. 나중에 Alibaba Cloud 비디오 서비스를 사용해 보았는데 괜찮았지만 클라이언트를 제공하지 않았습니다. 그러다가 클라이언트를 제공하는 NetEase Cloud Video를 발견하고 사용해 보았는데 NetEase Cloud의 지연 시간이 Alibaba Cloud보다 낮다는 것을 확인하고 라이브 비디오 서비스로 선택했습니다. NetEase Cloud의 API 예제는 Java로 되어 있습니다. 고객 서비스에 PHP가 있는지 문의한 후 NetEase Cloud의 API를 보냈습니다. 직접 작성할 방법도 없고 인터페이스도 간단합니다.
class v163Class{ 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); } /*****post请求******/ 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)); } }
NetEase는 윈도우 클라이언트를 제공하는데 사용시 렉이 있어서 아직까지 OBS를 직접 사용하고 있습니다. OBS는 간단한 구성을 갖춘 무료 라이브 비디오 클라이언트입니다. 라이브 방송을 시작하려면 스트림에 URL을 입력하세요.
이렇게 하면 라이브 스트리밍을 시작할 수 있습니다.
플레이어의 경우 video.js를 사용하세요. [추천도서: Node.js 동영상 튜토리얼]
<video id="zbvideo" class="video-js vjs-default-skin" controls preload="none" width="90%" height="398" poster="/static/images/videobg.jpg" data-setup="{}"> <source src="{$data.zb_http}" /> <source src="{$data.zb_hls}" type="application/x-mpegURL" /> <source src="{$data.zb_rtmp}" type="rtmp" /> </video> <link href="/plugin/videojs/video-js.css" rel="stylesheet"> <script src="/plugin/videojs/ie8/videojs-ie8.min.js"></script> <script src="/plugin/videojs/video.js"></script>
이렇게 하면 라이브 방송 서비스가 완성됩니다.
공용 클래스를 추가하면 자동으로 생성됩니다. API 기반 생방송 주소 새로고침 생방송 주소는 만료 시 자동으로 삭제됩니다.