153 lines
6.0 KiB
PHP
153 lines
6.0 KiB
PHP
<?php
|
|
ignore_user_abort(true);
|
|
if (!defined('IN_OAOOA')) {
|
|
exit('Access Denied');
|
|
}
|
|
@set_time_limit(0);
|
|
ini_set('memory_limit', -1);
|
|
@ini_set('max_execution_time', 0);
|
|
|
|
$locked = true;
|
|
$processnum = getglobal('config/convertprocessnum') ? getglobal('config/convertprocessnum'):1;
|
|
for($i=0;$i<$processnum;$i++) {
|
|
$processname = 'DZZ_LOCK_PICHOMEVIDEOCONVERT' . $i;
|
|
if (!dzz_process::islocked($processname, 60 * 15)) {
|
|
$locked = false;
|
|
break;
|
|
}
|
|
}
|
|
|
|
/*$i = 0;
|
|
$processname = 'DZZ_LOCK_PICHOMEVIDEOCONVERT'.$i;*/
|
|
$limit = 10;
|
|
$start=$i*$limit;
|
|
/*if (!dzz_process::islocked($processname, 60*15)) {
|
|
$locked=false;
|
|
}*/
|
|
//dzz_process::unlock($processname);
|
|
if ($locked) {
|
|
exit(json_encode( array('error'=>'进程已被锁定请稍后再试')));
|
|
}
|
|
//获取所有存储位置的视频处理状态
|
|
|
|
$cachename = 'PICHOMECONVERTSTATUS';
|
|
|
|
$convertstatus = C::t('cache')->fetch_cachedata_by_cachename($cachename);
|
|
if (!$convertstatus) {
|
|
$convertdata = [];
|
|
$app = C::t('app_market')->fetch_by_identifier('ffmpeg', 'dzz');
|
|
$appextra = unserialize($app['extra']);
|
|
$convertdata['dzz::'] = $appextra['status'];
|
|
foreach(DB::fetch_all("select id,bz,mediastatus from %t where 1",array('connect_storage')) as $v){
|
|
if($v['bz'] == 'dzz') continue;
|
|
$key = $v['bz'].':'.$v['id'].':';
|
|
$convertdata[$key] = intval($v['mediastatus']);
|
|
}
|
|
$setarr = ['cachekey' => $cachename, 'cachevalue' => serialize($convertdata), 'dateline' => time()];
|
|
C::t('cache')->insert_cachedata_by_cachename($setarr);
|
|
} else {
|
|
$convertdata =$convertstatus;
|
|
}
|
|
|
|
$convertsate = 0;
|
|
foreach($convertdata as $v){
|
|
if($v) $convertsate = 1;
|
|
}
|
|
if(!$convertsate) exit(json_encode( array('error'=>'转换未开启')));
|
|
if($_GET['id']){
|
|
$datas = DB::fetch_all("select vr.* from %t vr left join %t r on vr.rid=r.rid left join %t v on v.appid = r.appid where vr.id = %d and vr.status <= 0 and v.isdelete < 1
|
|
order by vr.jobnum asc limit $start,1",array('video_record','pichome_resources','pichome_vapp',$_GET['id']));
|
|
}else{
|
|
//查询符合执行条件的数据
|
|
$datas = DB::fetch_all("select vr.* from %t vr left join %t r on vr.rid=r.rid left join %t v on v.appid = r.appid where vr.status <= 0 and v.isdelete < 1
|
|
order by vr.jobnum asc limit $start,$limit",array('video_record','pichome_resources','pichome_vapp'));
|
|
|
|
}
|
|
|
|
|
|
if($datas){
|
|
foreach($datas as $v){
|
|
$processname1 = 'PICHOMEVIDEOCONVERT'.$v['id'];
|
|
//dzz_process::unlock($processname1);
|
|
//如果当前数据是锁定状态则跳过
|
|
if (dzz_process::islocked($processname1, 60*15)) {
|
|
continue;
|
|
}
|
|
if($v['rid']){
|
|
$metadata = IO::getMeta($v['rid']);
|
|
}else{
|
|
$metadata = IO::getMeta('attach::'.$v['aid']);
|
|
}
|
|
if(!$metadata) continue;
|
|
$bz = $metadata['bz'];
|
|
//$bzarr = explode(':',$bz);
|
|
if(!$v['ctype']){
|
|
//优先获取当前存储位置的视频处理服务是否开启
|
|
if($bz != 'dzz::' && $convertdata[$bz]){
|
|
$v['ctype'] = 2;
|
|
}elseif($convertdata['dzz::']){
|
|
$v['ctype'] = 1;
|
|
}else{
|
|
continue;
|
|
}
|
|
}
|
|
|
|
//更新当前数据获取缩略图执行次数和时间
|
|
C::t('video_record')->update($v['id'],array('jobnum'=>intval($v['jobnum'])+1,'endtime'=>strtotime('now')));
|
|
if($v['ctype'] == 1){
|
|
include_once DZZ_ROOT.'dzz'.BS.'ffmpeg'.BS.'class'.BS.'class_fmpeg.php';
|
|
$fm=new fmpeg();
|
|
$ret=$fm->convert($v['id'],$v['format'],$v['videoquality']);
|
|
}
|
|
elseif($v['ctype'] == 2){
|
|
include_once DZZ_ROOT.'dzz'.BS.'qcos'.BS.'class'.BS.'class_video.php';
|
|
$bzarr = explode(':',$bz);
|
|
if($bzarr[0] == 'QCOS'){
|
|
$qcosconfig = C::t('connect_storage')->fetch($metadata['remoteid']);
|
|
$hostarr = explode(':',$qcosconfig['hostname']);
|
|
$config = [
|
|
'secretId' => trim($qcosconfig['access_id']),
|
|
'secretKey' => dzzdecode($qcosconfig['access_key'], 'QCOS'),
|
|
'region' => $hostarr[1],
|
|
'schema' => $hostarr[0],
|
|
'bucket'=>trim($qcosconfig['bucket'])
|
|
];
|
|
$fpatharr = explode(':',$metadata['path']);
|
|
unset($fpatharr[0]);
|
|
$ofpath = $fpatharr[2];
|
|
|
|
$object = str_replace(BS,'/',$ofpath);
|
|
$outputpath = 'pichomethumb/'. date('Ym') . '/' . date('d') .'/'.md5($metadata['path']).'.'.$v['format'];
|
|
//创建转码任务
|
|
$fm = new video($config);
|
|
$data = $fm->create_mediajobs($object,$outputpath,$v['videoquality']);
|
|
if($data['error']){
|
|
C::t('video_record')->update($v['id'],array('status'=>-1,'endtime'=>strtotime('now'),'error'=>$data['error']));
|
|
}else{
|
|
unset($data['success']);
|
|
$data['path'] = $outputpath;
|
|
$data['ctype'] = $v['ctype'];
|
|
C::t('video_record')->update($v['id'],$data);
|
|
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
dzz_process::unlock($processname1);
|
|
|
|
}
|
|
dzz_process::unlock($processname);
|
|
if(DB::fetch_all("select count(vr.id) from %t vr left join %t r on vr.rid=r.rid left join %t v on v.appid = r.appid where vr.status <= 0 and v.isdelete < 1 and vr.endtime < v.dateline
|
|
and v.type = 1 order by vr.jobnum asc ",array('video_record','pichome_resources','pichome_vapp'))){
|
|
sleep(2);
|
|
dfsockopen(getglobal('localurl') . 'misc.php?mod=convert', 0, '', '', false, '',1);
|
|
}else{
|
|
sleep(2);
|
|
dfsockopen(getglobal('localurl') . 'misc.php?mod=getConvertStatus', 0, '', '', false, '',1);
|
|
}
|
|
}else{
|
|
dzz_process::unlock($processname);
|
|
}
|
|
|
|
exit('success'.$i); |