-
Notifications
You must be signed in to change notification settings - Fork 98
/
Copy pathconvert.php
153 lines (138 loc) · 5.98 KB
/
convert.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
<?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);