Showing
8 changed files
with
76 additions
and
34 deletions
... | @@ -126,8 +126,8 @@ class AdminMakeVideoController extends AdminController | ... | @@ -126,8 +126,8 @@ class AdminMakeVideoController extends AdminController |
126 | ->title('一言诗词库') | 126 | ->title('一言诗词库') |
127 | ->from(PoemTable2::make()) | 127 | ->from(PoemTable2::make()) |
128 | ->model(OnePoem2::class,'id','title'); | 128 | ->model(OnePoem2::class,'id','title'); |
129 | - $form->textarea('feel','有感'); | 129 | + $form->textarea('feel','有感')->default('读此一言,仿佛身临其境!'); |
130 | - $form->text('weather','天气'); | 130 | + $form->text('weather','天气')->default('多云'); |
131 | $form->text('huangli','黄历')->default('宜'); | 131 | $form->text('huangli','黄历')->default('宜'); |
132 | 132 | ||
133 | $form->radio('thumbnail','封面') | 133 | $form->radio('thumbnail','封面') | ... | ... |
... | @@ -120,32 +120,27 @@ class VideoTempController extends AdminController | ... | @@ -120,32 +120,27 @@ class VideoTempController extends AdminController |
120 | 'date' => '日期组件', | 120 | 'date' => '日期组件', |
121 | 'feel' => '临境有感组件', | 121 | 'feel' => '临境有感组件', |
122 | ]); | 122 | ]); |
123 | - $form->select('position','组件位置')->options(VideoTemp::POSITION_OPTIONS); | 123 | + $form->select('position','组件位置')->options(VideoTemp::POSITION_OPTIONS)->addElementClass('position'); |
124 | 124 | ||
125 | - $form->radio('draw', '文字效果') | ||
126 | - ->options(['fade'=>'淡入淡出', 'fix'=>'固定显示'])->default('fade') | ||
127 | - ->when('fade',function (Form\NestedForm $form){ | ||
128 | - $form->number('fade_time', 'fade时间')->default(1500); | ||
129 | $form->selectTable('font_file','字体') | 125 | $form->selectTable('font_file','字体') |
130 | ->title('字体选择') | 126 | ->title('字体选择') |
131 | ->from(FontTable::make()) | 127 | ->from(FontTable::make()) |
132 | ->model(Font::class,'file','name'); | 128 | ->model(Font::class,'file','name'); |
133 | - $form->number('font_size', '字号')->default(12)->min(12); | 129 | + $form->number('font_size', '字号')->default(24)->min(12); |
134 | $form->color('text_color', '字体颜色')->default('#f5f5f5')->addElementClass('text_color'); | 130 | $form->color('text_color', '字体颜色')->default('#f5f5f5')->addElementClass('text_color'); |
131 | + | ||
132 | + $form->radio('draw', '文字效果') | ||
133 | + ->options(['fade'=>'淡入淡出', 'fix'=>'固定显示'])->default('fade') | ||
134 | + ->when('fade',function (Form\NestedForm $form){ | ||
135 | + $form->number('fade_time', 'fade时间')->default(1500); | ||
135 | }) | 136 | }) |
136 | ->when('fix',function (Form\NestedForm $form){ | 137 | ->when('fix',function (Form\NestedForm $form){ |
137 | - $form->number('text_bg_box', '背景厚度')->default(0) | ||
138 | - ->addElementClass('text_bg_box')->help('设置背景块边缘厚度(用于在背景块边缘用背景色填充一圈),默认为0'); | ||
139 | $form->color('text_bg_color', '背景色')->default('#5c6bc6')->addElementClass('text_bg_color'); | 138 | $form->color('text_bg_color', '背景色')->default('#5c6bc6')->addElementClass('text_bg_color'); |
140 | - $form->selectTable('font_file','字体') | ||
141 | - ->title('字体选择') | ||
142 | - ->from(FontTable::make()) | ||
143 | - ->model(Font::class,'file','name'); | ||
144 | - $form->number('font_size', '字号')->default(12)->min(12); | ||
145 | - $form->color('text_color', '字体颜色')->default('#f5f5f5')->addElementClass('text_color'); | ||
146 | $form->number('opacity', '透明度')->min(0)->max(100) | 139 | $form->number('opacity', '透明度')->min(0)->max(100) |
147 | ->addElementClass('opacity')->default(100) | 140 | ->addElementClass('opacity')->default(100) |
148 | ->help('范围为0-100,100表示不透明,0表示完全透明'); | 141 | ->help('范围为0-100,100表示不透明,0表示完全透明'); |
142 | + $form->number('text_bg_box', '背景厚度')->default(0) | ||
143 | + ->addElementClass('text_bg_box')->help('设置背景块边缘厚度(用于在背景块边缘用背景色填充一圈),默认为0'); | ||
149 | }); | 144 | }); |
150 | }); | 145 | }); |
151 | 146 | ... | ... |
... | @@ -24,7 +24,7 @@ class TemplateTable extends LazyRenderable | ... | @@ -24,7 +24,7 @@ class TemplateTable extends LazyRenderable |
24 | $grid->column('','组件信息') | 24 | $grid->column('','组件信息') |
25 | ->display('展开') | 25 | ->display('展开') |
26 | ->expand(function (){ | 26 | ->expand(function (){ |
27 | - $th = ['id','模板id','名称','位置','字号']; | 27 | + $th = ['id','模板id','名称','位置','字号','文字颜色','文字效果','fade时间','背景色','透明度','背景厚度']; |
28 | return Table::make($th, $this->componentsTable->toArray())->withBorder(); | 28 | return Table::make($th, $this->componentsTable->toArray())->withBorder(); |
29 | }); | 29 | }); |
30 | 30 | ... | ... |
... | @@ -63,11 +63,11 @@ class AdminMakeImmerse implements ShouldQueue | ... | @@ -63,11 +63,11 @@ class AdminMakeImmerse implements ShouldQueue |
63 | 63 | ||
64 | // 判断双轨 没有则制作空轨 | 64 | // 判断双轨 没有则制作空轨 |
65 | $is_bgm = $this->adminMakeVideo->temp->bg_music == 1; //是否手动上传背景音 | 65 | $is_bgm = $this->adminMakeVideo->temp->bg_music == 1; //是否手动上传背景音 |
66 | + $bgm = $this->getAbsolutePath($this->adminMakeVideo->temp->bgm_url); | ||
66 | if ($this->media_info['format']['nb_streams'] >= 2) { /** 音频视频轨都有 */ | 67 | if ($this->media_info['format']['nb_streams'] >= 2) { /** 音频视频轨都有 */ |
67 | if ($is_bgm) { | 68 | if ($is_bgm) { |
68 | // 有背景音 融合 | 69 | // 有背景音 融合 |
69 | $audio = $this->getAbsolutePath($this->getTempPath('.mp3','audio')); | 70 | $audio = $this->getAbsolutePath($this->getTempPath('.mp3','audio')); |
70 | - $bgm = $this->getAbsolutePath($this->adminMakeVideo->temp->bgm_url); | ||
71 | $cmd = $this->ffmpeg . | 71 | $cmd = $this->ffmpeg . |
72 | ' -y -i ' . escapeshellarg($file) . | 72 | ' -y -i ' . escapeshellarg($file) . |
73 | ' -y -i ' . escapeshellarg($bgm) . | 73 | ' -y -i ' . escapeshellarg($bgm) . |
... | @@ -93,7 +93,6 @@ class AdminMakeImmerse implements ShouldQueue | ... | @@ -93,7 +93,6 @@ class AdminMakeImmerse implements ShouldQueue |
93 | if ($is_bgm) { | 93 | if ($is_bgm) { |
94 | // 有背景音 融合 | 94 | // 有背景音 融合 |
95 | $audio_empty = $audio; | 95 | $audio_empty = $audio; |
96 | - $bgm = $this->getAbsolutePath($this->adminMakeVideo->temp->bgm_url); | ||
97 | $audio = $this->getAbsolutePath($this->getTempPath('.mp3','audio')); | 96 | $audio = $this->getAbsolutePath($this->getTempPath('.mp3','audio')); |
98 | $cmd = $this->ffmpeg . | 97 | $cmd = $this->ffmpeg . |
99 | ' -y -i ' . escapeshellarg($audio_empty) . | 98 | ' -y -i ' . escapeshellarg($audio_empty) . |
... | @@ -150,7 +149,8 @@ class AdminMakeImmerse implements ShouldQueue | ... | @@ -150,7 +149,8 @@ class AdminMakeImmerse implements ShouldQueue |
150 | if (!$this->execCmd($cmd)) return ; | 149 | if (!$this->execCmd($cmd)) return ; |
151 | 150 | ||
152 | // 分析视频 入库 | 151 | // 分析视频 入库 |
153 | - $video_info = $this->mediainfo($this->getAbsolutePath($output)); | 152 | + $video_info = $this->mediaInfo($this->getAbsolutePath($output)); |
153 | + | ||
154 | Immerse::query()->create([ | 154 | Immerse::query()->create([ |
155 | 'user_id' => 1, | 155 | 'user_id' => 1, |
156 | 'title' => '', | 156 | 'title' => '', |
... | @@ -184,8 +184,6 @@ class AdminMakeImmerse implements ShouldQueue | ... | @@ -184,8 +184,6 @@ class AdminMakeImmerse implements ShouldQueue |
184 | 184 | ||
185 | public function mediaInfo($file) | 185 | public function mediaInfo($file) |
186 | { | 186 | { |
187 | - if ($this->media_info) return $this->media_info; | ||
188 | - | ||
189 | $cmd = $this->ffprobe . ' -v quiet -print_format json -show_format -show_streams ' . escapeshellarg($file); | 187 | $cmd = $this->ffprobe . ' -v quiet -print_format json -show_format -show_streams ' . escapeshellarg($file); |
190 | $output = $this->execCmd($cmd); | 188 | $output = $this->execCmd($cmd); |
191 | $data = json_decode($output, true); | 189 | $data = json_decode($output, true); |
... | @@ -199,6 +197,7 @@ class AdminMakeImmerse implements ShouldQueue | ... | @@ -199,6 +197,7 @@ class AdminMakeImmerse implements ShouldQueue |
199 | 197 | ||
200 | public function execCmd($cmd) | 198 | public function execCmd($cmd) |
201 | { | 199 | { |
200 | + echo $cmd . "\n". "\n"; | ||
202 | return shell_exec("{$cmd} 2>&1"); | 201 | return shell_exec("{$cmd} 2>&1"); |
203 | } | 202 | } |
204 | 203 | ... | ... |
This diff is collapsed. Click to expand it.
... | @@ -58,6 +58,11 @@ class Immerse extends Model | ... | @@ -58,6 +58,11 @@ class Immerse extends Model |
58 | return $this->hasOne(OnePoem::class,'id','poem_id'); | 58 | return $this->hasOne(OnePoem::class,'id','poem_id'); |
59 | } | 59 | } |
60 | 60 | ||
61 | + public function poem2() | ||
62 | + { | ||
63 | + return $this->hasOne(OnePoem2::class,'id','poem_id'); | ||
64 | + } | ||
65 | + | ||
61 | public function temp() | 66 | public function temp() |
62 | { | 67 | { |
63 | return $this->hasOne(VideoTemp::class,'id','temp_id'); | 68 | return $this->hasOne(VideoTemp::class,'id','temp_id'); | ... | ... |
... | @@ -34,7 +34,8 @@ class VideoTemp extends Model | ... | @@ -34,7 +34,8 @@ class VideoTemp extends Model |
34 | public function componentsTable() | 34 | public function componentsTable() |
35 | { | 35 | { |
36 | return $this->hasMany('App\Models\Component', 'temp_id') | 36 | return $this->hasMany('App\Models\Component', 'temp_id') |
37 | - ->select(['id', 'temp_id', 'name', 'position', 'font_size', 'text_color', 'text_bg_color', 'text_bg_box','opacity']); | 37 | + ->select(['id', 'temp_id', 'name', 'position', 'font_size', 'text_color', 'draw', |
38 | + 'fade_time', 'text_bg_color', 'text_bg_box', 'opacity']); | ||
38 | } | 39 | } |
39 | 40 | ||
40 | public function admin_make_video() | 41 | public function admin_make_video() | ... | ... |
... | @@ -40,7 +40,7 @@ | ... | @@ -40,7 +40,7 @@ |
40 | } | 40 | } |
41 | 41 | ||
42 | .poem-title { | 42 | .poem-title { |
43 | - font-size: 26px; | 43 | + font-size: 14px; |
44 | font-weight: bold; | 44 | font-weight: bold; |
45 | margin: 10px; | 45 | margin: 10px; |
46 | } | 46 | } |
... | @@ -51,7 +51,7 @@ | ... | @@ -51,7 +51,7 @@ |
51 | } | 51 | } |
52 | 52 | ||
53 | .poem-content { | 53 | .poem-content { |
54 | - font-size: 24px; | 54 | + font-size: 12px; |
55 | margin: 0; | 55 | margin: 0; |
56 | } | 56 | } |
57 | 57 | ||
... | @@ -64,13 +64,13 @@ | ... | @@ -64,13 +64,13 @@ |
64 | <div class="text">模板</div> | 64 | <div class="text">模板</div> |
65 | <img src="{{asset('storage/images/mobile-head.png')}}" alt="" width="360" height="80"> | 65 | <img src="{{asset('storage/images/mobile-head.png')}}" alt="" width="360" height="80"> |
66 | <div class="bg-box"> | 66 | <div class="bg-box"> |
67 | - <img width="360" height="625" class="bg_img" style="display: none"> | 67 | + {{--<img width="360" height="625" class="bg_img" style="display: none">--}} |
68 | - <video width="360" height="625" id="bg_video" style="display: none"></video> | 68 | + {{--<video width="360" height="625" id="bg_video" style="display: none"></video>--}} |
69 | - <audio id="bg_audio" ></audio> | 69 | + {{--<audio id="bg_audio" ></audio>--}} |
70 | </div> | 70 | </div> |
71 | <div class="poem-block"> | 71 | <div class="poem-block"> |
72 | - <p class="poem-title">题破山寺后禅院</p> | 72 | + {{--<p class="poem-title">题破山寺后禅院</p>--}} |
73 | - <p class="poem-author">-- 常建</p> | 73 | + {{--<p class="poem-author">-- 常建</p>--}} |
74 | <p class="poem-content">清晨入古寺,初日照高林。</p> | 74 | <p class="poem-content">清晨入古寺,初日照高林。</p> |
75 | <p class="poem-content">曲径通幽处,禅房花木深。</p> | 75 | <p class="poem-content">曲径通幽处,禅房花木深。</p> |
76 | <p class="poem-content">山光悦鸟性,潭影空人心。</p> | 76 | <p class="poem-content">山光悦鸟性,潭影空人心。</p> |
... | @@ -86,20 +86,62 @@ | ... | @@ -86,20 +86,62 @@ |
86 | 86 | ||
87 | $(document).off('click', '.sync').on('click', '.sync', function () { | 87 | $(document).off('click', '.sync').on('click', '.sync', function () { |
88 | let ori_top = 80; | 88 | let ori_top = 80; |
89 | - let top = parseInt($('.field_top').val()) + ori_top; | 89 | + let top = 0 + ori_top; |
90 | - let left = $('.field_left').val(); | 90 | + let left = 0; |
91 | let font = $('.field_font_size').val(); | 91 | let font = $('.field_font_size').val(); |
92 | - let content_size = 12 + parseInt(font); | 92 | + let content_size = parseInt(font); |
93 | - let title_size = 14 + parseInt(font); | 93 | + let title_size = parseInt(font); |
94 | let text_color = $('.text_color').val() || 'whitesmoke'; | 94 | let text_color = $('.text_color').val() || 'whitesmoke'; |
95 | let text_bg_color = $('.text_bg_color').val() || '#5c6bc6'; | 95 | let text_bg_color = $('.text_bg_color').val() || '#5c6bc6'; |
96 | let opacity = parseInt($('.opacity').val()) / 100; | 96 | let opacity = parseInt($('.opacity').val()) / 100; |
97 | + let pos = $('.field_position').val(); | ||
97 | 98 | ||
98 | $('.poem-block').css('top', top + 'px').css('left', left + 'px') | 99 | $('.poem-block').css('top', top + 'px').css('left', left + 'px') |
99 | .css('background-color', text_bg_color).css('opacity', opacity); | 100 | .css('background-color', text_bg_color).css('opacity', opacity); |
100 | $('.poem-title').css('font-size', title_size + 'px').css('color', text_color); | 101 | $('.poem-title').css('font-size', title_size + 'px').css('color', text_color); |
101 | $('.poem-content').css('font-size', content_size + 'px').css('color', text_color); | 102 | $('.poem-content').css('font-size', content_size + 'px').css('color', text_color); |
102 | 103 | ||
104 | + let block_w = $('.poem-block').width(); | ||
105 | + let block_h = $('.poem-block').height(); | ||
106 | + switch (pos) { | ||
107 | + case 'topLeft': | ||
108 | + top = 0 + ori_top; | ||
109 | + left = 0; | ||
110 | + break; | ||
111 | + case 'topMiddle': | ||
112 | + top = 0 + ori_top; | ||
113 | + left = (360 - block_w) / 2; | ||
114 | + break; | ||
115 | + case 'topRight': | ||
116 | + top = 0 + ori_top; | ||
117 | + left = 360 - block_w; | ||
118 | + break; | ||
119 | + case 'midLeft': | ||
120 | + top = (640 - block_h) / 2 + ori_top; | ||
121 | + left = 0; | ||
122 | + break; | ||
123 | + case 'midMiddle': | ||
124 | + top = (640 - block_h) / 2 + ori_top; | ||
125 | + left = (360 - block_w) / 2; | ||
126 | + break; | ||
127 | + case 'midRight': | ||
128 | + top = (640 - block_h) / 2 + ori_top; | ||
129 | + left = 360 - block_w; | ||
130 | + break; | ||
131 | + case 'botLeft': | ||
132 | + top = 640 - block_h + ori_top; | ||
133 | + left = 0; | ||
134 | + break; | ||
135 | + case 'botMiddle': | ||
136 | + top = 640 - block_h + ori_top; | ||
137 | + left = (360 - block_w) / 2; | ||
138 | + break; | ||
139 | + case 'botRight': | ||
140 | + top = 640 - block_h + ori_top; | ||
141 | + left = 360 - block_w; | ||
142 | + break; | ||
143 | + } | ||
144 | + $('.poem-block').css('top', top + 'px').css('left', left + 'px') | ||
103 | 145 | ||
104 | let bg_img_url = $('.bg_img_url').find("input[type='hidden'][name='bg_url']").val(); | 146 | let bg_img_url = $('.bg_img_url').find("input[type='hidden'][name='bg_url']").val(); |
105 | if (bg_img_url !== '') { | 147 | if (bg_img_url !== '') { | ... | ... |
-
Please register or login to post a comment