1. 程式人生 > >如何利用網易雲直播的介面做一個直播專案

如何利用網易雲直播的介面做一個直播專案

        公司新下來了一個需求,為了讓更多的企業hr線上看我們公司的“hr沙龍培訓活動”(之前一直是到現場聽),於是購買了網易雲的直播服務,做一個線上直播觀看的活動。

        購買完成後,輸入賬號密碼,在後臺應用中建立我們自己的應用。在建立的應用中,我們手動建立自己的直播頻道(這個是可以通過介面用程式碼完成,我們之所以手動建立,因為我的得推流入口就幾個,也是固定的,所以就省了一點力)。如果要用介面來建立,就需要進行介面鑑權。文件上給出的是java示例,我這裡給出我的PHP示例,供參考。

<?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。

        我們這個直播專案只是一個簡單的教學直播,沒有互動,彈幕的環節,如果你想做這樣的直播,那就要購買網易雲的另外一個服務了,叫做互動直播,這個功能就很強大了。(完)