李帅

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

...@@ -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.
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');
......