一:下载七牛云SDK
composer require qiniu/php-sdk
二:php实现七牛云demo
<?phpnamespace common\helpers;use common\models\Config;use common\models\VideoApiLog;use Qiniu\Auth;use Qiniu\Processing\PersistentFop;use Qiniu\Storage\UploadManager;use Yii;use yii\helpers\ArrayHelper;use common\helpers\Universal;use yii\helpers\FileHelper;use yii\httpclient\Client;use yii\web\ServerErrorHttpException;use function Qiniu\base64_urlSafeEncode;/** * 七牛云解决 * * @author wangjian * @since 0.1 */class QiNiu{ /** * @var string accessKey */ public $accessKey; /** * @var string accessKey */ public $secretKey; /** * @var string bucket */ public $bucket; /** * @var string url */ public $url; /** * @var string pipeline */ public $pipeline; //过程状态 const STATUS_SUCCESS = 0;//胜利 const STATUS_WAIT = 1;//期待 const STATUS_GO = 2;//执行中 const STATUS_ERROR = 3;//失败 /** * 初始化 */ public function __construct() { $this->accessKey = ""; $this->secretKey = ""; $this->bucket = ""; $this->url = ""; $this->pipeline = ""; } /** * 获取上传token */ public function getToken() { $auth = new Auth($this->accessKey, $this->secretKey); // 生成上传Token $token = $auth->uploadToken($this->bucket); return $token; } /** * 上传 */ public function upload($file, $saveFileName = null) { $token = $this->getToken(); $uploadMgr = new UploadManager(); if ($saveFileName === null) { $pathinfo = is_array($file) ? pathinfo($file['name']) : $file; $extension = $pathinfo['extension']; $saveFileName = Yii::$app->getSecurity()->generateRandomString() . '-' . date('His',time()) .".".$extension; } //上传到七牛云后 保留的文件名 $tmpName = is_array($file) ? $file['tmp_name'] : $file; list($result, $err) = $uploadMgr->putFile($token,$saveFileName,$tmpName); if ($err !== null) { return false; } return [ 'file' => $saveFileName, 'url' => $this->url . $saveFileName, ]; } /** * 获取已上传音视频元信息 */ public function getAvinfo($file) { $client = new Client(); $response = $client->createRequest() ->setMethod('post') ->setUrl($this->url . $file . '?avinfo') // 申请地址 ->send(); if ($response->isOk) { return $response->data; } return []; } /** * 获取过程解决状态 */ public function persistentStatus($persistentId) { $auth = new Auth($this->accessKey, $this->secretKey); $config = new \Qiniu\Config(); $pfop = new PersistentFop($auth, $config); list($result, $error) = $pfop->status($persistentId); if ($error != null) { return self::STATUS_ERROR; } $code = isset($result['code']) ? $result['code'] : 3; return $code; } /** * 获取视频指定帧图片 */ public function getVideoImage($file, $saveFile = null, $offset = 1) { $auth = new Auth($this->accessKey, $this->secretKey); $config = new \Qiniu\Config(); $pfop = new PersistentFop($auth, $config); if ($saveFile == null) { $fileName = basename($file); $pathinfo = pathinfo($fileName); $saveFile = $pathinfo['filename'] . '.jpg'; } $entry = base64_urlSafeEncode("$this->bucket:$saveFile"); $fops = "vframe/jpg/offset/". $offset ."|saveas/$entry"; $pipeline = null; if ($this->pipeline) { $pipelineArr = explode(',', $this->pipeline); $pipeline = $pipelineArr[array_rand($pipelineArr,1)]; } list($id, $err) = $pfop->execute($this->bucket, $file, $fops, $pipeline); if ($err != null) { return false; } //查问过程状态 $persistentStatus = false; $code = self::STATUS_ERROR; while ($persistentStatus === false) { sleep(1); $code = $this->persistentStatus($id); if (in_array($code,[self::STATUS_SUCCESS, self::STATUS_ERROR])) { $persistentStatus = true; } } if ($code == self::STATUS_SUCCESS) { return [ 'url' => $this->url . $saveFile, 'file' => $saveFile ]; } return false; } /** * 视频解决 */ public function avthumb($file, $saveFileName = null, $param = []) { if (empty($param)) { return false; } $auth = new Auth($this->accessKey, $this->secretKey); $config = new \Qiniu\Config(); $pfop = new PersistentFop($auth, $config); $pathinfo = pathinfo($file); $extension = strtolower($pathinfo['extension']); if ($saveFileName === null) { $saveFileName = Yii::$app->getSecurity()->generateRandomString() . '-' . date('His',time()) .".".$extension; } $entry = base64_urlSafeEncode("$this->bucket:$saveFileName"); $fops = "avthumb/" . $extension; //裁剪 $star = isset($param['star']) ? $param['star'] : 0; $end = isset($param['end']) ? $param['end'] : 0; $star = intval($star); $end = intval($end); if (!((empty($star) && empty($end)) || ($star >= $end))) { //须要裁剪 $duration = $end - $star; if (!empty($duration)) { $fops .= "/ss/". $star ."/t/" . $duration;/*截取片段*/ } } //文字水印 $wmText = isset($param['wmText']) ? $param['wmText'] : ''; if ($wmText) { $fops .= "/wmText/". base64_urlSafeEncode($wmText); //透明度 $wmAlpha = isset($param['wmAlpha']) ? $param['wmAlpha'] : '1.0'; $fops .= "/wmAlpha/". $wmAlpha; //字体 $wmFont = isset($param['wmFont']) ? $param['wmFont'] : '宋体'; $wmFont = base64_urlSafeEncode($wmFont); $fops .= "/wmFont/". $wmFont; //水印色彩 $wmFontColor = isset($param['wmFontColor']) ? $param['wmFontColor'] : '#ffffff'; $wmFontColor = base64_urlSafeEncode($wmFontColor); $fops .= "/wmFontColor/". $wmFontColor; //水印文字大小 $wmFontSize = isset($param['wmFontSize']) ? $param['wmFontSize'] : '30'; $fops .= "/wmFontSize/". $wmFontSize; //水印文字地位 $wmGravityText = isset($param['wmGravityText']) ? $param['wmGravityText'] : 'SouthWest';//方位 $wmOffsetX = isset($param['wmOffsetX']) ? $param['wmOffsetX'] : '0';//X偏移量 $wmOffsetY = isset($param['wmOffsetY']) ? $param['wmOffsetY'] : '0';//Y偏移量 $fops .= "/wmGravityText/". $wmGravityText . "/wmOffsetX/" . $wmOffsetX . "/wmOffsetY/" . $wmOffsetY; } $audio = isset($param['audio']) ? $param['audio'] : ''; //音频 if ($audio) { $fops .= "/multiArep/" . base64_urlSafeEncode('kodo://'. $this->bucket .'/' . $audio); } $fops .= "|saveas/$entry"; $pipeline = null; if ($this->pipeline) { $pipelineArr = explode(',', $this->pipeline); $pipeline = $pipelineArr[array_rand($pipelineArr,1)]; } list($persistentId, $err) = $pfop->execute($this->bucket, $file, $fops, $pipeline); if ($err != null) { return false; } //查问过程状态 $persistentStatus = false; $code = self::STATUS_ERROR; while ($persistentStatus === false) { sleep(1); $code = $this->persistentStatus($persistentId); if (in_array($code,[self::STATUS_SUCCESS, self::STATUS_ERROR])) { $persistentStatus = true; } } if ($code == self::STATUS_SUCCESS) { return [ 'file' => $saveFileName, 'url' => $this->url . $saveFileName, 'duration' => $duration, ]; } return false; }}
将其中的accessKey,secretKey,bucket,url,pipeline参数换成你本人七牛云账号的信息
三:简略实现
1:实现上传
$qiniu = new QiNiu();$qiniu->upload($_FILES['file']);
2:获取上传的音视频信息
$file = '';//上传七牛云后文件名$qiniu = new QiNiu();$qiniu->getAvinfo($file);
3:获取视频指定帧图片
$file = '';//上传七牛云后视频名称$qiniu = new QiNiu();$qiniu->getVideoImage($file);//其余参数参考demo
4:视频解决(裁剪,文字水印,增加音频)
$file = '';//上传七牛云后视频名称$qiniu = new QiNiu();$qiniu->avthumb($file);//其余参数参考demo