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