PHP

首页 -  PHP  -  php腾讯云点播视频加密

php腾讯云点播视频加密

php腾讯云点播视频加密,ProcessFile(案例为laravel)

路由:

//视频详情
Route::get('video/info/{id}','Api\ProcessFileController@getVideoInfo');
//视频加密接口
Route::get('encrypt/{id}','Api\ProcessFileController@encryptVideo');
//视频播放获取秘钥
Route::get('keyurl','Api\ProcessFileController@getVideoKey');
//视频加密回调
Route::any('back','Api\ProcessFileController@backSend');
//视频解密
Route::get('drm','Api\ProcessFileController@getVideoDrm');

类:

<?php
/**
 * Created by PhpStorm.
 * User: Shu_Q_Gang
 * Date: 2019/3/25
 * Time: 17:11
 */

namespace App\Http\Controllers\Api;


use App\Http\Controllers\Controller;
use App\Http\Model\Resources;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;

class ProcessFileController extends Controller
{

    private $txUrl = 'https://vod.api.qcloud.com/v2/index.php?';

    private $SecretId = '腾讯secretId';

    private $SecretKey = '腾讯secretKey';

    private $signStr = 'GETvod.api.qcloud.com/v2/index.php?';

    /**
     * 视频详细信息
     */
    public function getVideoInfo($fileId)
    {
        $data['Action'] = 'GetVideoInfo';
        $data['fileId'] = (string)$fileId; //视频媒体id
        $data['Nonce'] = rand(1000,9999);
        $data['SecretId'] = $this->SecretId;
        $data['Timestamp'] = time();
        //签名
        $data['Signature'] = $this->sign($data);

        $str = '';
        foreach ($data as $k=>$row){
            $str.=$k.'='.urlencode($row).'&';
        }
        $str = substr($str, 0, -1);

        $url = $this->txUrl.$str;

        $arrContextOptions = array(
            "ssl" => array(
                "verify_peer" => false,
                "verify_peer_name" => false,
            ),
        );
        $result = file_get_contents($url,false, stream_context_create($arrContextOptions));
        dd(json_decode($result));

    }


    /**
     * 视频加密
     */
    public function encryptVideo($fileId)
    {
        $data['Action'] = 'ProcessFile';
        $data['fileId'] = (string)$fileId; //视频媒体id
        $data['Nonce'] = rand(1000000,9999999);
        $data['SecretId'] = $this->SecretId;
        $data['Timestamp'] = (int)time();
        //加密模板210流畅 220 标清 230 高清 240 全高清
        $data['transcode.definition.0'] = 210;
        $data['transcode.definition.1'] = 220;
        //$data['transcode.definition.3'] = 230;
        //$data['transcode.definition.4'] = 240;
        $data['notifyMode'] = 'Finish';
        $data['transcode.drm.definition'] = 10;

        //签名
        $data['Signature'] = $this->sign($data);

        $str = '';
        foreach ($data as $k=>$row){
            $str.=$k.'='.urlencode($row).'&';
        }
        $str = substr($str, 0, -1);

        $url = $this->txUrl.$str;

        $arrContextOptions = array(
            "ssl" => array(
                "verify_peer" => false,
                "verify_peer_name" => false,
            ),
        );
        $result = file_get_contents($url,false, stream_context_create($arrContextOptions));
        $resObj = json_decode($result);
        if($resObj->code == 0){
            //加密成功
            $obj = Resources::where('file_id',$fileId)->first();
            if($obj){
                $obj->process = '是';
                $obj->save();
            }
        }
        Log::info("加密回调:".$result);
    }



    /**
     * 视频解密获取dk
     */
    public function getVideoDrm($edkList)
    {
        //Log::info('解密edk:'.$edkList);
        $data['Action'] = 'DescribeDrmDataKey';
        $data['edkList.n'] = (string)$edkList;
        $data['Nonce'] = rand(1000,9999);
        $data['Timestamp'] = time();
        $data['SecretId'] = $this->SecretId;
        //签名
        $data['Signature'] = $this->sign($data);
        $str = '';
        foreach ($data as $k=>$row){
            $str.=$k.'='.urlencode($row).'&';
        }
        $str = substr($str, 0, -1);
        $url = $this->txUrl.$str;
        $arrContextOptions = array(
            "ssl" => array(
                "verify_peer"=>false,
                "verify_peer_name"=>false,
            ),
        );
        $result = file_get_contents($url,false, stream_context_create($arrContextOptions));
        $data = json_decode($result);
        if($data->code == 0){
            $dk = (($data->data)->keyList)[0];
            $dkstr = $dk->dk;
            return $dkstr;
        }else{
            return '';
        }
    }



    /**
     * @param $param
     * @return string
     * 签名
     */
    public function sign($param)
    {
        // 参数排序
        ksort($param);
        // 生成待签名字符串
        $signStr = $this->signStr;
        foreach ( $param as $key => $value ) {
            $signStr = $signStr . $key . "=" . $value . "&";
        }
        $signStr = substr($signStr, 0, -1);
        // 生成签名
        $signature = base64_encode(hash_hmac("sha1", $signStr, $this->SecretKey, true));
        return $signature;
    }


    /**
     *  获取秘钥
     */
    public function getVideoKey(Request $request)
    {
        $fileId = $request->input('fileId');
        $edk = $request->input('edk');
        $obj = Resources::where('file_id',$fileId)->first();
        if($obj){
            if($obj->dk){
                $dk = $obj->dk;
            }else{
                $dk = $this->getVideoDrm($edk);
                //修改数据库
                $obj = Resources::where('file_id',$fileId)->first();
                if($obj){
                    $obj->edk = $edk;
                    $obj->dk = $dk;
                    $obj->save();
                }
            }
            return base64_decode($dk);
        }else{
            return "fail";
        }
    }


    /**
     * 加密回调
     */
    public function backSend(Request $request)
    {
        $res = $request->input('data');
        //Log::info(json_encode($res));
        if( $res['errCode'] == 0 )
        {
            $drm = $res['drm'];
            $edk = $drm['edkList'][0];
            $dk = $this->getVideoDrm($edk);
            //修改数据库
            $obj = Resources::where('file_id',$res['fileId'])->first();
            if($obj){
                $obj->edk = $edk;
                $obj->dk = $dk;
                $obj->save();
            }
            Log::info("dk:".$dk);
        }
    }
}


(0)
分享:

本文由:xiaoshu168 作者:xiaoshu发表,转载请注明来源!

标签:

相关阅读