config.php
class Config
{
const AK = '你的AK',
SK = '你的SK',
BUCKET_NAME = '******',//空间名称
DOMAIN = '你的七牛空间域名';
}
require_once APP_ROOT.'/vendor/autoload.php';
require_once APP_ROOT.'/vendor/config.php';
use Qiniu\Auth;
use Qiniu\Processing\PersistentFop;//查询转码状态
use Qiniu\Storage\BucketManager;//删除文件
//直接上传到七牛
$bucket = Config::BUCKET_NAME;
$auth = new Auth(Config::AK, Config::SK);
//转码时使用的队列名称
$pipeline = Config::Peline;
//添加水印
$wmImg = Qiniu\base64_urlSafeEncode("http://".$_SERVER['SERVER_NAME']."/Public/qiniuw_logo.png");
//要进行转码的转码操作
//转码策略https://developer.qiniu.com/dora/api/audio-and-video-transcoding-avthumb
//添加水印规格https://developer.qiniu.com/dora/api/video-watermarking
$fops = "avthumb/mp4/vcodec/libx264/s/640x360/wmImage/$wmImg/wmGravity/NorthEast/wmOffsetX/0/wmOffsetY/0";
//转码为h264 长宽为640*360 添加水印 水印位置为右上角偏移量都为0
//可以对转码后的文件进行使用saveas参数自定义命名,当然也可以不指定文件会默认命名并保存在当间
$savekey = Qiniu\base64_urlSafeEncode($bucket);//不指定名称让七牛随机生成
$fops = $fops.'|saveas/'.$savekey;
//七牛异步通知地址 不方便ajax轮询的话可以添加
$NotifyUrl="http://".$_SERVER['SERVER_NAME'].U('member/Qiniunotify/video');
$policy = array(
'persistentOps' => $fops,
'persistentPipeline' => $pipeline,
'persistentNotifyUrl'=>$NotifyUrl
);
//生成token
$uptoken = $auth->uploadToken($bucket, null, 3600, $policy);
//--------------------------------------html页面-----------------
var Uploader = WebUploader.create({
auto: true,
runtimeOrder: 'html5,flash',
swf: '__PUBLIC__/member/js/Uploader.swf',
server: 'http://up.qiniu.com/',//固定七牛的地址
accept: {
title: 'video',
extensions: 'asf,avi,mov,3gp,flv,mp4,m4a,mpeg,mpg,vob',
mimeTypes: '.asf,.avi,.mov,.3gp,.flv,.mp4,.m4a,.mpeg,.mpg,.vob'
},
fileSingleSizeLimit: 1024 * 1024 * 1024,
fileNumLimit: 1,
formData: {
token : "" //上传七牛所需要的token
}
});
Uploader.addButton({id:'#uploadFile',multiple:false});//绑定按钮
//如果需要每点击一次上传都要获取token的话添加下面的代码 放到绑定事件下面
Uploader.on( 'uploadBeforeSend', function( file,from ) {
//获取token
$.ajax({
url: "{:U('material/uptoken')}",
type: "POST",
async: false,
dataType:'json',
success:function(data){
from.token =data.uptoken;//修改formData中的token
}
});
})
//上传成功的话 log输出返回信息
//hash:"Fo9QFn0w7S2UTkSWT9sNhefdF71_"
//key:"Fo9QFn0w7S2UTkSWT9sNhefdF71_"//上传后的文件名称
//persistentId:"z0.58b7d81845a2650c999f3ece"//查询转码进度要使用的id
//----------------------------轮询的话--------------------------------------
//七牛查询并不会返回进度 只会返回状态
$persistentId = $_POST['persistentId'];//查询文件的persistentId
$status = PersistentFop::status($persistentId);
//返回信息如下
{
'code': 0,
'id': '168739cd2fn1g76f13',
'inputKey':'asdasdasdsqweqweqdcasc'
'desc': 'The fop was completed successfully',
'items': [
{
'code': 0,
'hash': 'FvvxM7gMI6WfiuXlBgKbkzU67Tpa',
'cmd': 'avthumb/mp3/ar/44100/ab/32k',
'key': 'sFhZ4dSjB1zvL3De1UBX2qZ_VR0=/lgxucMCQso_KOW_YDM-_KVIeX6o5',
'error': '',
'desc': 'The fop was completed successfully'
}
]
}
$status=$status;
if($status['code']==0){//转码成功
$new_myfode=$status['items'][0];
$v_url=Config::DOMAIN.$new_myfode['key'];//域名+转码后的视频名字
$vid_dir=APP_ROOT."/uploads/video";//视频和封面图保存路径
$qiniu_im=$v_url."?vframe/jpg/offset/0";//获取视频封面图
$img_name=rand(1,99999).time().".jpg";//封面图名字
$re=getFilepapers($qiniu_im,$vid_dir,$img_name);//下载封面图
$new_name=rand(1,99999).time().".mp4";//视频名称
$data['video_thumb']="/uploads/video/".$re['file_name'];
$video=getFilepapers($v_url,$vid_dir,$new_name);//七牛获取视频到本地
$data['dir'] ="/uploads/video/".$video['file_name'];
$data['member_id']=$this->member_id;
$data['title'] = $video_name;
$data['id'] = M('pano_video')->add($data);
//删除七牛的文件
$bucket = Config::BUCKET_NAME;
$auth = new Auth(Config::AK, Config::SK);
$bucketMgr = new BucketManager($auth);
$err = $bucketMgr->delete($bucket,$new_myfode['key']);//转码后视频
$err = $bucketMgr->delete($bucket,$status['inputKey']);//转码前视频
$array=array('code'=>0,'msg'=>'请求成功','res'=>$data);
}elseif($status['code']==1){//等待处理
$array=array('code'=>1,'msg'=>'等待处理');
}elseif($status['code']==2){//处理失败
$array=array('code'=>1,'msg'=>'正在处理');
}else{
$array=array('code'=>2,'msg'=>'处理失败');
}
$this->ajaxreturn($array);die();
//-----------------------------轮询结束---------------------------
//----------------------------异步处理的话-------------------------
$callbackBody = file_get_contents('php://input');//接受参数处理方法同上
$status=json_decode($callbackBody,true);
/*获取远程资源*/
function getFilepapers($url,$save_dir='',$filename='',$type=0){
if(trim($url)==''){
return false;
}
if(trim($save_dir)==''){
$save_dir='./';
}
if(0!==strrpos($save_dir,'/')){
$save_dir.='/';
}
//创建保存目录
if(!file_exists($save_dir)&&!mkdir($save_dir,0777,true)){
return false;
}
//获取远程文件所采用的方法
if($type){
$ch=curl_init();
$timeout=5;
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,$timeout);
$content=curl_exec($ch);
curl_close($ch);
}else{
ob_start();
readfile($url);
$content=ob_get_contents();
ob_end_clean();
}
$size=strlen($content);
//文件大小
$fp2=@fopen($save_dir.$filename,'a');
fwrite($fp2,$content);
fclose($fp2);
unset($content,$url);
return array('file_name'=>$filename,'save_path'=>$save_dir.$filename);
}