Меня включили в очередь на выполнение команды. Поэтому иногда в очереди много запросов, и их выполнение занимает много времени.
Вот почему мне приходится показывать индикатор выполнения для идентификации пользователя, сколько времени потребуется для создания видео. Для этого сценария мне нужно оценить время.
Может быть, можно вычислить его по другим параметрам, которые отображаются в выходных данных, например, fps, битрейт или скорость.
Есть идеи?
Код: Выделить всё
//DownloadJob.php;
public function __construct($video,$transparent_img,$output_file)
{
$this->video=$video;
$this->transparent_img = $transparent_img;
$this->output_file = $output_file;
$create_at = date('Y-m-d H:i:s');
$this->status =0;
$this->download_id = base64_encode($video);
DB::beginTransaction();
DB::insert('INSERT INTO jobs_download(download_id,image,video,status,output_video,create_time)
VALUES(?,?,?,?,?,?)',[$this->download_id,$this->video,$this->transparent_img,$this->status,$this->output_file,$create_at]);
DB::commit();
}
public function handle()
{
$video=$this->video;
$transparent_img=$this->transparent_img;
$output_file=$this->output_file;
$ready=1;
$failed=2;
$input_video = $video;
$transparent_img = $transparent_img;
try{
$ffmpeg = "C:\\ffmpeg\\bin\\ffmpeg";
$cmd = $ffmpeg . " -i " . $input_video . " -i " . $transparent_img . " -filter_complex 'overlay' " . $output_file;
//Log::info($cmd);
exec($cmd, $output);
if(file_exists($output_file)){
DB::beginTransaction();
DB::update('UPDATE jobs_download SET status=? WHERE download_id =?',[$ready,$this->download_id]);
$this->status = 1;
DB::commit();
if(file_exists($input_video)){
unlink($input_video);
}
if(file_exists($transparent_img)){
unlink($transparent_img);
}
}else{
Log::error('DownloadJob.php failed()',['download_id'=>$this->download_id]);
DB::beginTransaction();
DB::update('UPDATE jobs_download SET status=? WHERE download_id =? ',[$failed,$this->download_id]);
$this->status = 3;
DB::commit();
}
}catch (\Exception $e){
Log::error('DownloadJob.php failed()',['download_id'=>$this->download_id]);
DB::beginTransaction();
DB::update('UPDATE jobs_download SET status=? WHERE download_id =? ',[$failed,$this->download_id]);
$this->status = 3;
DB::commit();
}
}
public function failed()
{
$failed = 2;
Log::error('DownloadJob.php failed()',['download_id'=>$this->download_id]);
DB::beginTransaction();
DB::update('UPDATE jobs_download SET status=? WHERE download_id =? ',[$failed,$this->download_id]);
$this->status = 3;
DB::commit();
}
public function getResponse()
{
return ['download_id' => $this->download_id,'eta_time_sec' => $eta_time_sec];
}
Код: Выделить всё
public function generateVideo(Request $request_body)
{
//Overlay file
$transparent_img=Input::file('transparent_img');
//Main file
$video=Input::file('video');
$output_file = $video_name;
//Send in queue for ffmpeg overlay
$job = new DownloadJob($video_name,$image,$output_file);
$data = $this->dispatch($job);
$dl_url = $job->getResponse();//Get response download_id and estimate time in second
print_r($dl_url);
Вывод
Я хочу, чтобы этот ответ был включен в результат вывода.
Код: Выделить всё
[
'download_id':'NWM1ODAwNDU3NzkxOV92aWRlb19maWxlXzE1NDkyNzExMDkubXA0',
'eta_time_sec':5
]
Подробнее здесь: https://stackoverflow.com/questions/545 ... -using-php
Мобильная версия