利用雲視頻實現線上教育和美女主播系統。 最近美女主播跟游戲主播很火啊,哥也在整個美女視頻直播系統,相對其他web應用。視頻直播相對來說還是有點複雜。使用FMS搭建了服務端測試一下,直播還是不夠穩定。後來試了下阿裡雲視頻服務,感覺還可以,但是它沒有提供客戶端。然後找到了網易雲視頻,它有提供了客戶端,試 ...
利用雲視頻實現線上教育和美女主播系統。
最近美女主播跟游戲主播很火啊,哥也在整個美女視頻直播系統,相對其他web應用。視頻直播相對來說還是有點複雜。使用FMS搭建了服務端測試一下,直播還是不夠穩定。後來試了下阿裡雲視頻服務,感覺還可以,但是它沒有提供客戶端。然後找到了網易雲視頻,它有提供了客戶端,試用一下,網易雲延遲比阿裡雲會低點,然後就選他作為視頻直播服務。網易雲的api示例是java的,問客服有沒有php的,然後發給我一個網易雲信的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)); } }
網易有提供window客戶端,在使用的時候出現卡頓現象,所以還是直接使用OBS。OBS是款免費的視頻直播客戶端,配置也簡單。在串流里填下url即可開始直播。
這樣就可以開始直播。
播放器的話使用video.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自動生成直播地址,刷新直播地址,到期自動刪除直播地址。
演示地址:http://www.deitui.com/index.php?m=openclass 當然有直播的時候才能看視頻直播。