Showing
5 changed files
with
101 additions
and
20 deletions
| ... | @@ -2,6 +2,7 @@ | ... | @@ -2,6 +2,7 @@ |
| 2 | 2 | ||
| 3 | namespace App\Console\Commands; | 3 | namespace App\Console\Commands; |
| 4 | 4 | ||
| 5 | +use App\Jobs\MakeImages; | ||
| 5 | use App\Models\AdminMakeVideo; | 6 | use App\Models\AdminMakeVideo; |
| 6 | use App\Models\Immerse; | 7 | use App\Models\Immerse; |
| 7 | use App\Models\VideoTemp; | 8 | use App\Models\VideoTemp; |
| ... | @@ -50,6 +51,71 @@ class DevFFmpeg extends Command | ... | @@ -50,6 +51,71 @@ class DevFFmpeg extends Command |
| 50 | */ | 51 | */ |
| 51 | public function handle() | 52 | public function handle() |
| 52 | { | 53 | { |
| 54 | + MakeImages::dispatch(AdminMakeVideo::query()->find(24)); | ||
| 55 | + dd(1); | ||
| 56 | + $image = Storage::disk('public')->path('images/73f18d443820334c51c36f443c9683b3.png'); | ||
| 57 | + $watermark = Storage::disk('public')->path('ffmpeg/LOGO_eng.png'); | ||
| 58 | + $end_wallpaper = Storage::disk('public')->path('ffmpeg/output_new_end_wallpaper.png'); | ||
| 59 | + | ||
| 60 | + | ||
| 61 | + // 制作最后一帧 | ||
| 62 | + $size = '1242x2208'; | ||
| 63 | + $time_length = 0.7; | ||
| 64 | + $r = 24; | ||
| 65 | + $last_frame_video = $this->getTempPath('.mp4'); | ||
| 66 | + $font = Storage::disk('public')->path('ffmpeg/arialuni.ttf'); | ||
| 67 | + | ||
| 68 | + $cmd = $this->ffmpeg . ' -y -i ' . escapeshellarg($image) . | ||
| 69 | + ' -i ' . escapeshellarg($watermark) . | ||
| 70 | + " -f lavfi -i nullsrc=s={$size}:d={$time_length}:r={$r} -f lavfi -i aevalsrc=0:duration={$time_length}" . | ||
| 71 | + ' -filter_complex "'. | ||
| 72 | + ' [0:0] ' . $this->getTextContentString() . | ||
| 73 | + '[text];[text][1:0]overlay=20:20[water];' . | ||
| 74 | + ' [water]select=\'eq(n,0)\',setpts=PTS-STARTPTS[lastframe];[2:v][lastframe]overlay[v] " ' . | ||
| 75 | + ' -map [v] -map 3:a ' . escapeshellarg($last_frame_video); | ||
| 76 | + $output = $this->execmd($cmd); | ||
| 77 | + | ||
| 78 | + | ||
| 79 | + // 利用最后一帧制作动画 | ||
| 80 | + $signature_x = 0; | ||
| 81 | + $signature_y = -20; | ||
| 82 | + $animate = $this->makeAnimate($last_frame_video, $end_wallpaper, '', $signature_x, $signature_y, $font); | ||
| 83 | + | ||
| 84 | + | ||
| 85 | + | ||
| 86 | + dd($animate); | ||
| 87 | + | ||
| 88 | + | ||
| 89 | + | ||
| 90 | + | ||
| 91 | + | ||
| 92 | + // 这样实现不了 | ||
| 93 | + $cmd = $this->ffmpeg . ' -y -i ' . | ||
| 94 | + escapeshellarg($image) . | ||
| 95 | + " -f lavfi -i nullsrc=s=1242x2208:d=0.7:r=24 ". | ||
| 96 | + ' -i ' . escapeshellarg($watermark) . | ||
| 97 | + ' -i ' . escapeshellarg($end_wallpaper) . | ||
| 98 | + | ||
| 99 | + ' -filter_complex "' . | ||
| 100 | + ' [0:v] ' . $this->getTextContentString() . | ||
| 101 | + ' [text];[text][2:0]overlay=20:20[water];' . | ||
| 102 | + | ||
| 103 | + | ||
| 104 | + ' [water]select=\'eq(n,1)\',setpts=PTS-STARTPTS[lastframe];[1:v][lastframe]overlay[last];' . | ||
| 105 | + ' [last]boxblur=8[blur];' . | ||
| 106 | + ' [blur][3:v]overlay=(main_w-overlay_w)/2:(main_h-overlay_h)/2 [lay];' . | ||
| 107 | + ' [lay]geq=lum=\'if(lte(T,0.6), 255*T*(1/0.6),255)\',format=gray[grad];' . | ||
| 108 | + ' [lay][grad]alphamerge[alpha];' . | ||
| 109 | +// ' [last][alpha]overlay[concat2];'. | ||
| 110 | + | ||
| 111 | + ' [water][alpha] concat=n=2:v=1[v]" ' . | ||
| 112 | + | ||
| 113 | + escapeshellarg($this->getTempPath('.mp4')); | ||
| 114 | + | ||
| 115 | + $output = $this->execmd($cmd); | ||
| 116 | + | ||
| 117 | + dd($output); | ||
| 118 | + | ||
| 53 | dd(Str::contains("/Users/lishuai/Documents/source/OnePoem-Server/storage/app/public/ffmpeg/output_16479198841364.mp4",'/storage/app/public/')); | 119 | dd(Str::contains("/Users/lishuai/Documents/source/OnePoem-Server/storage/app/public/ffmpeg/output_16479198841364.mp4",'/storage/app/public/')); |
| 54 | 120 | ||
| 55 | $path = '/Users/lishuai/Desktop/test/'; | 121 | $path = '/Users/lishuai/Desktop/test/'; | ... | ... |
| ... | @@ -6,6 +6,7 @@ use App\Http\Controllers\Controller; | ... | @@ -6,6 +6,7 @@ use App\Http\Controllers\Controller; |
| 6 | use App\Models\Immerse; | 6 | use App\Models\Immerse; |
| 7 | use App\Models\UserMakeVideo; | 7 | use App\Models\UserMakeVideo; |
| 8 | use App\Jobs\UserMakeVideo as MakeVideo; | 8 | use App\Jobs\UserMakeVideo as MakeVideo; |
| 9 | +use App\Jobs\UserMakeImages as MakeImages; | ||
| 9 | use Illuminate\Http\Request; | 10 | use Illuminate\Http\Request; |
| 10 | use Illuminate\Support\Facades\Storage; | 11 | use Illuminate\Support\Facades\Storage; |
| 11 | use Illuminate\Support\Facades\Validator; | 12 | use Illuminate\Support\Facades\Validator; |
| ... | @@ -34,8 +35,9 @@ class ImmerseController extends Controller | ... | @@ -34,8 +35,9 @@ class ImmerseController extends Controller |
| 34 | public function store(Request $request) | 35 | public function store(Request $request) |
| 35 | { | 36 | { |
| 36 | $validator = Validator::make($request->all(),[ | 37 | $validator = Validator::make($request->all(),[ |
| 37 | - 'video_url' => 'required|string', | 38 | + 'item_url' => 'required|string', |
| 38 | - 'video_id' => 'required', | 39 | + 'item_id' => 'required', |
| 40 | + 'type' => 'required', | ||
| 39 | 'content' => 'sometimes', | 41 | 'content' => 'sometimes', |
| 40 | 'weather' => 'sometimes', | 42 | 'weather' => 'sometimes', |
| 41 | 'thumbnail_url' => 'sometimes', | 43 | 'thumbnail_url' => 'sometimes', |
| ... | @@ -47,20 +49,39 @@ class ImmerseController extends Controller | ... | @@ -47,20 +49,39 @@ class ImmerseController extends Controller |
| 47 | 49 | ||
| 48 | $validated = $validator->validated(); | 50 | $validated = $validator->validated(); |
| 49 | 51 | ||
| 50 | - if (Str::contains($validated['video_url'],'//')){ | 52 | + if (Str::contains($validated['item_url'],'//')){ |
| 51 | - $video_url = '' ; | 53 | + $item_url = '' ; |
| 52 | - }elseif (Str::contains($validated['video_url'],'/storage/app/public/')){ | 54 | + }elseif (Str::contains($validated['item_url'],'/storage/app/public/')){ |
| 53 | - $video_url = $validated['video_url']; | 55 | + $item_url = $validated['item_url']; |
| 54 | }else{ | 56 | }else{ |
| 55 | - $video_url = Storage::disk('public')->path($validated['video_url']); | 57 | + $item_url = Storage::disk('public')->path($validated['item_url']); |
| 56 | } | 58 | } |
| 57 | 59 | ||
| 58 | - $immerse = Immerse::query()->find($request->video_id); | 60 | + $immerse = Immerse::query()->find($request->item_id); |
| 59 | 61 | ||
| 60 | - $video = UserMakeVideo::query()->create([ | 62 | + if ($validated['type'] == 1){ |
| 63 | + // 图文音频 | ||
| 64 | + $create = UserMakeVideo::query()->create([ | ||
| 61 | 'poem_id' => $immerse->poem_id, | 65 | 'poem_id' => $immerse->poem_id, |
| 62 | 'type' => $immerse->type, | 66 | 'type' => $immerse->type, |
| 63 | - 'video_url' => $video_url, | 67 | + 'video_url' => $item_url, |
| 68 | + 'image_url' => $immerse->image_url, | ||
| 69 | + 'bg_music' => $immerse->bg_music, | ||
| 70 | + 'bgm_url' => $immerse->bgm_url, | ||
| 71 | + 'feel' => $validated['content'], | ||
| 72 | + 'weather' => $validated['weather'], | ||
| 73 | + 'temp_id' => $immerse->temp_id, | ||
| 74 | + 'thumbnail' => $validated['thumbnail_url'] ? 1 : 0, | ||
| 75 | + 'thumbnail_url' => $validated['thumbnail_url'], | ||
| 76 | + ]); | ||
| 77 | + // 添加至队列 | ||
| 78 | + MakeImages::dispatch($create); | ||
| 79 | + }else{ | ||
| 80 | + // 视频 | ||
| 81 | + $create = UserMakeVideo::query()->create([ | ||
| 82 | + 'poem_id' => $immerse->poem_id, | ||
| 83 | + 'type' => $immerse->type, | ||
| 84 | + 'video_url' => $item_url, | ||
| 64 | 'image_url' => $immerse->image_url, | 85 | 'image_url' => $immerse->image_url, |
| 65 | 'bg_music' => $immerse->bg_music, | 86 | 'bg_music' => $immerse->bg_music, |
| 66 | 'bgm_url' => $immerse->bgm_url, | 87 | 'bgm_url' => $immerse->bgm_url, |
| ... | @@ -72,7 +93,10 @@ class ImmerseController extends Controller | ... | @@ -72,7 +93,10 @@ class ImmerseController extends Controller |
| 72 | ]); | 93 | ]); |
| 73 | 94 | ||
| 74 | // 添加至队列 | 95 | // 添加至队列 |
| 75 | - MakeVideo::dispatch($video); | 96 | + MakeVideo::dispatch($create); |
| 97 | + } | ||
| 98 | + | ||
| 99 | + | ||
| 76 | 100 | ||
| 77 | return Response::created(); | 101 | return Response::created(); |
| 78 | } | 102 | } | ... | ... |
This diff is collapsed. Click to expand it.
app/Jobs/UserMakeImages.php
0 → 100644
This diff is collapsed. Click to expand it.
| ... | @@ -33,15 +33,6 @@ class AdminMakeVideo extends Model | ... | @@ -33,15 +33,6 @@ class AdminMakeVideo extends Model |
| 33 | return Storage::disk('public')->url($this->thumbnail_url); | 33 | return Storage::disk('public')->url($this->thumbnail_url); |
| 34 | } | 34 | } |
| 35 | 35 | ||
| 36 | - public function getImagesUrl() | ||
| 37 | - { | ||
| 38 | - if (Str::contains($this->images_url, '//')) { | ||
| 39 | - return $this->images_url; | ||
| 40 | - } | ||
| 41 | - | ||
| 42 | - return Storage::disk('public')->url($this->images_url); | ||
| 43 | - } | ||
| 44 | - | ||
| 45 | public function poem() | 36 | public function poem() |
| 46 | { | 37 | { |
| 47 | return $this->hasOne(OnePoem::class,'id','poem_id'); | 38 | return $this->hasOne(OnePoem::class,'id','poem_id'); | ... | ... |
-
Please register or login to post a comment