You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

85 lines
2.1 KiB

<?php
namespace App\Services;
use App\Jobs\BilibiliEncode;
use App\Services\FfmpegService;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Redis;
class QueuedFfmpegService {
private $ffmpegService;
public function __construct()
{
$this->ffmpegService = new FfmpegService();
$this->ffmpegService->setNeedRemoveAfterEncode(true);
$this->ffmpegService->setNeedRemoveExistFiles(false);
}
public function processDir($path)
{
$files = scandir($path);
foreach ($files as $file) {
if ($file == "." || $file == ".." || $file == ".DS_Store" || $file == "1762") {
continue;
}
$subDir = implode(DIRECTORY_SEPARATOR, [$path, $file]);
$isDir = is_dir($subDir);
if ($isDir) {
$this->processDir($subDir);
} else {
$this->addToQueue($subDir);
}
}
}
public function addToQueue($file)
{
// BilibiliEncode::dispatch($file);
Redis::connection()->rpush("file_to_encode", $file);
// $result = Redis::publish("file_to_process", $file);
// echo $result;
}
public function processQueue()
{
while (true) {
Log::info("start or restart process files in redis queue");
$empty = true;
$item = Redis::connection()->rpop("file_to_encode");
while ($item != null) {
echo $item . "\n";
$empty = false;
$item = Redis::connection()->rpop("file_to_encode");
$this->ffmpegService->processVideo($item);
}
if ($empty) {
Log::info("process end sleep 300 seconds");
} else {
Log::info("process queue empty sleep 300 seconds");
}
sleep(5 *60);
}
exit;
// redis 订阅逻辑
// Redis::subscribe(["file_to_process"], function ($message) use ($ffmpeg) {
// echo $message;
// sleep(10);
// $ffmpeg->processVideo($message);
// });
}
}