李帅

1.后台可上传图文内容。

......@@ -2,6 +2,7 @@
namespace App\Console\Commands;
use App\Jobs\MakeImages;
use App\Models\AdminMakeVideo;
use App\Models\Immerse;
use App\Models\VideoTemp;
......@@ -50,6 +51,71 @@ class DevFFmpeg extends Command
*/
public function handle()
{
MakeImages::dispatch(AdminMakeVideo::query()->find(24));
dd(1);
$image = Storage::disk('public')->path('images/73f18d443820334c51c36f443c9683b3.png');
$watermark = Storage::disk('public')->path('ffmpeg/LOGO_eng.png');
$end_wallpaper = Storage::disk('public')->path('ffmpeg/output_new_end_wallpaper.png');
// 制作最后一帧
$size = '1242x2208';
$time_length = 0.7;
$r = 24;
$last_frame_video = $this->getTempPath('.mp4');
$font = Storage::disk('public')->path('ffmpeg/arialuni.ttf');
$cmd = $this->ffmpeg . ' -y -i ' . escapeshellarg($image) .
' -i ' . escapeshellarg($watermark) .
" -f lavfi -i nullsrc=s={$size}:d={$time_length}:r={$r} -f lavfi -i aevalsrc=0:duration={$time_length}" .
' -filter_complex "'.
' [0:0] ' . $this->getTextContentString() .
'[text];[text][1:0]overlay=20:20[water];' .
' [water]select=\'eq(n,0)\',setpts=PTS-STARTPTS[lastframe];[2:v][lastframe]overlay[v] " ' .
' -map [v] -map 3:a ' . escapeshellarg($last_frame_video);
$output = $this->execmd($cmd);
// 利用最后一帧制作动画
$signature_x = 0;
$signature_y = -20;
$animate = $this->makeAnimate($last_frame_video, $end_wallpaper, '', $signature_x, $signature_y, $font);
dd($animate);
// 这样实现不了
$cmd = $this->ffmpeg . ' -y -i ' .
escapeshellarg($image) .
" -f lavfi -i nullsrc=s=1242x2208:d=0.7:r=24 ".
' -i ' . escapeshellarg($watermark) .
' -i ' . escapeshellarg($end_wallpaper) .
' -filter_complex "' .
' [0:v] ' . $this->getTextContentString() .
' [text];[text][2:0]overlay=20:20[water];' .
' [water]select=\'eq(n,1)\',setpts=PTS-STARTPTS[lastframe];[1:v][lastframe]overlay[last];' .
' [last]boxblur=8[blur];' .
' [blur][3:v]overlay=(main_w-overlay_w)/2:(main_h-overlay_h)/2 [lay];' .
' [lay]geq=lum=\'if(lte(T,0.6), 255*T*(1/0.6),255)\',format=gray[grad];' .
' [lay][grad]alphamerge[alpha];' .
// ' [last][alpha]overlay[concat2];'.
' [water][alpha] concat=n=2:v=1[v]" ' .
escapeshellarg($this->getTempPath('.mp4'));
$output = $this->execmd($cmd);
dd($output);
dd(Str::contains("/Users/lishuai/Documents/source/OnePoem-Server/storage/app/public/ffmpeg/output_16479198841364.mp4",'/storage/app/public/'));
$path = '/Users/lishuai/Desktop/test/';
......
......@@ -6,6 +6,7 @@ use App\Http\Controllers\Controller;
use App\Models\Immerse;
use App\Models\UserMakeVideo;
use App\Jobs\UserMakeVideo as MakeVideo;
use App\Jobs\UserMakeImages as MakeImages;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\Validator;
......@@ -34,8 +35,9 @@ class ImmerseController extends Controller
public function store(Request $request)
{
$validator = Validator::make($request->all(),[
'video_url' => 'required|string',
'video_id' => 'required',
'item_url' => 'required|string',
'item_id' => 'required',
'type' => 'required',
'content' => 'sometimes',
'weather' => 'sometimes',
'thumbnail_url' => 'sometimes',
......@@ -47,20 +49,39 @@ class ImmerseController extends Controller
$validated = $validator->validated();
if (Str::contains($validated['video_url'],'//')){
$video_url = '' ;
}elseif (Str::contains($validated['video_url'],'/storage/app/public/')){
$video_url = $validated['video_url'];
if (Str::contains($validated['item_url'],'//')){
$item_url = '' ;
}elseif (Str::contains($validated['item_url'],'/storage/app/public/')){
$item_url = $validated['item_url'];
}else{
$video_url = Storage::disk('public')->path($validated['video_url']);
$item_url = Storage::disk('public')->path($validated['item_url']);
}
$immerse = Immerse::query()->find($request->video_id);
$immerse = Immerse::query()->find($request->item_id);
$video = UserMakeVideo::query()->create([
if ($validated['type'] == 1){
// 图文音频
$create = UserMakeVideo::query()->create([
'poem_id' => $immerse->poem_id,
'type' => $immerse->type,
'video_url' => $video_url,
'video_url' => $item_url,
'image_url' => $immerse->image_url,
'bg_music' => $immerse->bg_music,
'bgm_url' => $immerse->bgm_url,
'feel' => $validated['content'],
'weather' => $validated['weather'],
'temp_id' => $immerse->temp_id,
'thumbnail' => $validated['thumbnail_url'] ? 1 : 0,
'thumbnail_url' => $validated['thumbnail_url'],
]);
// 添加至队列
MakeImages::dispatch($create);
}else{
// 视频
$create = UserMakeVideo::query()->create([
'poem_id' => $immerse->poem_id,
'type' => $immerse->type,
'video_url' => $item_url,
'image_url' => $immerse->image_url,
'bg_music' => $immerse->bg_music,
'bgm_url' => $immerse->bgm_url,
......@@ -72,7 +93,10 @@ class ImmerseController extends Controller
]);
// 添加至队列
MakeVideo::dispatch($video);
MakeVideo::dispatch($create);
}
return Response::created();
}
......
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
......@@ -33,15 +33,6 @@ class AdminMakeVideo extends Model
return Storage::disk('public')->url($this->thumbnail_url);
}
public function getImagesUrl()
{
if (Str::contains($this->images_url, '//')) {
return $this->images_url;
}
return Storage::disk('public')->url($this->images_url);
}
public function poem()
{
return $this->hasOne(OnePoem::class,'id','poem_id');
......