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);
}
}
}