Просмотр исходного кода

新增分镜历史图片视频功能

lh 3 месяцев назад
Родитель
Сommit
96c971ffa9

+ 15 - 2
app/Http/Controllers/Anime/AnimeController.php

@@ -129,13 +129,13 @@ class AnimeController extends BaseController
     }
 
     // 一键生成分镜
-    public function batchSetSegmentTasks(Request $request) {
+    public function batchSetSegmentPics(Request $request) {
         // 忽略所有超时限制
         set_time_limit(0);
         ini_set('max_execution_time', '0');
 
         $data = $request->all();
-        $result = $this->AnimeService->batchSetSegmentTasks($data);
+        $result = $this->AnimeService->batchSetSegmentPics($data);
         return $this->success($result);
     }
 
@@ -182,6 +182,19 @@ class AnimeController extends BaseController
         return $this->success(['success'=>$result ? 1: 0]);
     }
 
+    // 分镜历史图片|视频
+    public function segmentHistory(Request $request) {
+        $data = $request->all();
+        $result = $this->AnimeService->segmentHistory($data);
+        return $this->success($result);
+    }
+
+    public function createSegmentVideoTask(Request $request) {
+        $data = $request->all();
+        $result = $this->AnimeService->createSegmentVideoTask($data);
+        return $this->success($result);
+    }
+
     // public function scriptList(Request $request) {
     //     $data = $request->all();
     //     $result = $this->AnimeService->scriptList($data);

+ 10 - 1
app/Libs/Helpers.php

@@ -2514,6 +2514,7 @@ function handleEpisodeContent($originalContent) {
 // 出镜角色:许芸-校服装、徐母
 // 台词内容:我一到家,徐母的扫帚就落在我身上,嘴里一个劲地骂我,
 // 画面类型:普通画面
+// 尾帧描述:手持拍摄微晃镜头,中年妇女猛力挥动扫帚击打少女背部,少女身体因冲击微颤,阴影中的肥胖男子目光冷冷跟随。
 
 // 分镜2
 // 画面描述:徐母面容扭曲,嘴唇快速开合,扫帚挥舞在空中。
@@ -2524,6 +2525,7 @@ function handleEpisodeContent($originalContent) {
 // 出镜角色:徐母
 // 台词内容:问我夜不归宿死哪儿去了。
 // 画面类型:对口型
+// 尾帧描述:固定镜头,中年妇女面部肌肉剧烈抖动,嘴唇快速开合进行辱骂,背景中的扫帚在空中上下挥动。
 
 // ##第2幕:徐家简陋客厅 黄昏 室内
 // 分镜3
@@ -2535,6 +2537,7 @@ function handleEpisodeContent($originalContent) {
 // 出镜角色:无
 // 台词内容:可我没想到,半个月后,徐母居然再一次外出,
 // 画面类型:普通画面
+// 尾帧描述:固定镜头。昏黄的夕阳余晖在地面上缓慢移动,空气中的浮尘在光束中跳动,室内维持着死寂的安静。
 
 // 分镜4
 // 画面描述:一张泛黄的火车票特写,上面显示着隔壁市的站名和日期。
@@ -2545,6 +2548,7 @@ function handleEpisodeContent($originalContent) {
 // 出镜角色:无
 // 台词内容:这次是去隔壁市看望她生病的好姐妹。
 // 画面类型:普通画面
+// 尾帧描述:固定镜头。光影在火车票表面微微晃动,强调其陈旧的纸张纹理与关键的行程信息。
 // \n\n';
     
     // 解析剧集内容
@@ -2669,7 +2673,8 @@ function handleEpisodeContent($originalContent) {
                     'dialogue'        => '',
                     'frame_type'      => '',
                     'scene'           => '',  // 新增:场景
-                    'characters'      => ''   // 新增:出镜角色
+                    'characters'      => '',  // 新增:出镜角色
+                    'tail_frame'      => '',  // 新增:尾帧描述
                 ];
                 
                 // 提取各个字段 - 兼容中文冒号和英文冒号,支持多种表达方式
@@ -2699,6 +2704,10 @@ function handleEpisodeContent($originalContent) {
                 if (preg_match('/(?:出镜角色|角色出镜|登场角色|人物)[::]\s*([^\n]+)/u', $segmentContent, $charactersMatch)) {
                     $segmentData['characters'] = trim($charactersMatch[1]);
                 }
+                // 新增:尾帧描述字段
+                if (preg_match('/(?:尾帧描述|尾帧|结束帧|最后一帧|结尾画面|结束画面)[::]\s*([^\n]+)/u', $segmentContent, $tailFrameMatch)) {
+                    $segmentData['tail_frame'] = trim($tailFrameMatch[1]);
+                }
                 
                 $segments[] = $segmentData;
             }

+ 35 - 1
app/Services/Anime/AnimeService.php

@@ -454,7 +454,7 @@ class AnimeService
         return $img_url;
     }
 
-    public function batchSetSegmentTasks($data) {
+    public function batchSetSegmentPics($data) {
         $anime_id = getProp($data, 'anime_id');
         $episode_number = getProp($data, 'episode_number');
         $ratio = getProp($data, 'ratio');
@@ -1236,6 +1236,36 @@ class AnimeService
         return true;
     }
 
+    public function segmentHistory($data) {
+        $segment_id = getProp($data, 'segment_id');
+
+        // 获取历史图片
+        $pics = [];
+        $pic_history = DB::table('mp_generate_pic_tasks')->where('alias_segment_id', $segment_id)->where('status', 'success')->orderBy('created_at', 'desc')->get();
+        foreach($pic_history as $task) {
+            $result_url = getProp($task, 'result_url');
+            if (is_json($result_url)) {
+                $pics = array_merge($pics, json_decode($result_url, true));
+            }else {
+                $pics[] = $result_url;
+            }
+        }
+        
+        // 获取历史视频
+        $videos = [];
+        $video_history = DB::table('mp_generate_video_tasks')->where('alias_segment_id', $segment_id)->where('status', 'success')->orderBy('created_at', 'desc')->get();
+        foreach($video_history as $task) {
+            $result_url = getProp($task, 'result_url');
+            if (is_json($result_url)) {
+                $videos = array_merge($pics, json_decode($result_url, true));
+            }else {
+                $videos[] = $result_url;
+            }
+        }
+
+        return compact('pics', 'videos');
+    }
+
     // 轮训获取图片任务结果
     private function loopGetPicTaskResult($task_id) {
         $start_count = 0;
@@ -1358,4 +1388,8 @@ class AnimeService
 
         return $segmentData;
     }
+
+    public function createSegmentVideoTask($data) {
+        
+    }
 }

+ 5 - 0
app/Services/DeepSeek/DeepSeekService.php

@@ -2679,6 +2679,7 @@ EOD;
                     4.5“分镜信息”中的“配音角色”需对应本集中的<主体列表>中的一个(非对话内容则统一固定为“旁白”角色),不得自己生成。
                     4.6“分镜信息”中的“场景”需对应本集中的<场景列表>中的一个(不带详细表述)
                     4.7“分镜信息”中的“出镜角色”需对应本集中的<主体列表>中的一个或多个(不带详细描述),如果没有出镜角色则填无
+                    4.8“分镜信息”中的“尾帧描述”需根据本镜和下一镜的剧本信息进行过渡生成,用于后续转视频进行衔接上下镜头的画面
                 示例格式:\n\n
                 第1集:隐形的守护者
 
@@ -2714,6 +2715,7 @@ EOD;
                 出镜角色:许芸-校服装、徐母
                 台词内容:我一到家,徐母的扫帚就落在我身上,嘴里一个劲地骂我,
                 画面类型:普通画面
+                尾帧描述:手持拍摄微晃镜头,中年妇女猛力挥动扫帚击打少女背部,少女身体因冲击微颤,阴影中的肥胖男子目光冷冷跟随。
 
                 分镜2
                 画面描述:徐母面容扭曲,嘴唇快速开合,扫帚挥舞在空中。
@@ -2724,6 +2726,7 @@ EOD;
                 出镜角色:徐母
                 台词内容:问我夜不归宿死哪儿去了。
                 画面类型:对口型
+                尾帧描述:固定镜头,中年妇女面部肌肉剧烈抖动,嘴唇快速开合进行辱骂,背景中的扫帚在空中上下挥动。
                 
                 ##第2幕:徐家简陋客厅 黄昏 室内
                 分镜3
@@ -2735,6 +2738,7 @@ EOD;
                 出镜角色:无
                 台词内容:可我没想到,半个月后,徐母居然再一次外出,
                 画面类型:普通画面
+                尾帧描述:固定镜头。昏黄的夕阳余晖在地面上缓慢移动,空气中的浮尘在光束中跳动,室内维持着死寂的安静。
 
                 分镜4
                 画面描述:一张泛黄的火车票特写,上面显示着隔壁市的站名和日期。
@@ -2745,6 +2749,7 @@ EOD;
                 出镜角色:无
                 台词内容:这次是去隔壁市看望她生病的好姐妹。
                 画面类型:普通画面
+                尾帧描述:固定镜头。光影在火车票表面微微晃动,强调其陈旧的纸张纹理与关键的行程信息。
                 \n\n";
 
         // 获取章节内容

+ 4 - 1
routes/api.php

@@ -142,12 +142,15 @@ Route::group(['middleware' => ['bindToken', 'bindExportToken', 'checkLogin']], f
         Route::post('batchSetRoleImg', [AnimeController::class, 'batchSetRoleImg']);
         Route::post('batchSetSceneImg', [AnimeController::class, 'batchSetSceneImg']);
         Route::post('chatChangeImg', [AnimeController::class, 'chatChangeImg']);
-        Route::post('batchSetSegmentTasks', [AnimeController::class, 'batchSetSegmentTasks']);
+        Route::post('batchSetSegmentPics', [AnimeController::class, 'batchSetSegmentPics']);
         Route::post('reGenerateSegment', [AnimeController::class, 'reGenerateSegment']);
         Route::post('addSegment', [AnimeController::class, 'addSegment']);
         Route::post('copySegment', [AnimeController::class, 'copySegment']);
         Route::post('moveSegment', [AnimeController::class, 'moveSegment']);
         Route::post('delSegment', [AnimeController::class, 'delSegment']);
+        Route::post('segmentHistory', [AnimeController::class, 'segmentHistory']);
+        Route::post('createSegmentVideoTask', [AnimeController::class, 'createSegmentVideoTask']);
+        Route::post('batchSetSegmentVideos', [AnimeController::class, 'batchSetSegmentVideos']);
     });
     
 });