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); } } }
本文由:xiaoshu168 作者:xiaoshu发表,转载请注明来源!