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

音频任务成功后赋值音频时长给视频截止时间点

lh 2 месяцев назад
Родитель
Сommit
ca714ee06a
2 измененных файлов с 70 добавлено и 43 удалено
  1. 67 43
      app/Http/Controllers/Anime/AnimeController.php
  2. 3 0
      app/Services/Anime/AnimeService.php

+ 67 - 43
app/Http/Controllers/Anime/AnimeController.php

@@ -1603,6 +1603,9 @@ class AnimeController extends BaseController
             if ($uncompleted_pic_count == 0 && $uncompleted_audio_count == 0) {
                 $completedCount = DB::table('mp_episode_segments')->where('anime_id', $animeId)->where('episode_id', $episodeId)->where('pic_task_id', '<>', '')->where('pic_task_status', '已完成')->count('id');
 
+                // 获取剧集信息之前先处理视频截止时间点
+                $this->handleVideoTimePointEnd();
+
                 // 获取剧集信息
                 $episode = DB::table('mp_anime_episodes')
                     ->where('anime_id', $animeId)
@@ -1803,6 +1806,9 @@ class AnimeController extends BaseController
                     
                     // 如果所有分镜都已处理完成(成功或失败),获取最终结果并结束连接
                     if (count($processedSegments) === count($segments)) {
+                        // 获取剧集信息之前先处理视频截止时间点
+                        $this->handleVideoTimePointEnd();
+
                         // 获取剧集信息
                         $episode = DB::table('mp_anime_episodes')
                             ->where('anime_id', $animeId)
@@ -1827,49 +1833,9 @@ class AnimeController extends BaseController
                                 })->toArray();
                             
                             // 按照episodeInfo的格式组织数据
-                            $acts = [];
-                            foreach($allSegments as $segment) {
-                                $segmentData = [
-                                    'segment_id' => getProp($segment, 'segment_id'),
-                                    'segment_number' => getProp($segment, 'segment_number'),
-                                    'segment_content' => getProp($segment, 'segment_content'),
-                                    'description' => getProp($segment, 'description'),
-                                    'composition' => getProp($segment, 'composition'),
-                                    'camera_movement' => getProp($segment, 'camera_movement'),
-                                    'voice_actor' => getProp($segment, 'voice_actor'),
-                                    'dialogue' => getProp($segment, 'dialogue'),
-                                    'frame_type' => getProp($segment, 'frame_type'),
-                                    'scene' => getProp($segment, 'scene'),
-                                    'characters' => getProp($segment, 'characters'),
-                                    'tail_frame' => getProp($segment, 'tail_frame'),
-                                    'emotion' => getProp($segment, 'emotion'),
-                                    'emotion_type' => getProp($segment, 'emotion_type'),
-                                    'gender' => getProp($segment, 'gender'),
-                                    'speed_ratio' => getProp($segment, 'speed_ratio'),
-                                    'loudness_ratio' => getProp($segment, 'loudness_ratio'),
-                                    'emotion_scale' => getProp($segment, 'emotion_scale'),
-                                    'pitch' => getProp($segment, 'pitch'),
-                                    'voice_name' => getProp($segment, 'voice_name'),
-                                    'voice_type' => getProp($segment, 'voice_type'),
-                                    'voice_audio_url' => getProp($segment, 'voice_audio_url'),
-                                    'img_url' => getProp($segment, 'img_url'),
-                                    'audio_url' => getProp($segment, 'audio_url'),
-                                    'video_url' => getProp($segment, 'video_url'),
-                                    'last_frame_url' => getProp($segment, 'last_frame_url'),
-                                ];
-                                
-                                $actNumber = getProp($segment, 'act_number');
-                                if (isset($acts[$actNumber])) {
-                                    $acts[$actNumber]['segments'][] = $segmentData;
-                                } else {
-                                    $acts[$actNumber] = [
-                                        'act_number' => $actNumber,
-                                        'act_title' => getProp($segment, 'act_title'),
-                                        'segments' => [$segmentData]
-                                    ];
-                                }
-                            }
-                            $episode['acts'] = array_values($acts);
+                            $segmentsStructure = $this->AnimeService->buildEpisodeSegmentsStructure($allSegments);
+                            $episode['acts'] = $segmentsStructure['acts'];
+                            $episode['total_duration'] = $segmentsStructure['total_duration'];
                         }
                         
                         echo "data: " . json_encode([
@@ -1950,4 +1916,62 @@ class AnimeController extends BaseController
         $result = $this->AnimeService->previewAudio($data);
         return $this->success($result);
     }
+
+    private function handleVideoTimePointEnd() {
+        // 处理音频时长,循环查询dub_video_task_queue列表中的任务
+        $queueLength = Redis::llen('dub_video_task_queue');
+        if ($queueLength > 0) {
+            $processedTaskIds = []; // 记录已处理的任务ID
+            
+            // 遍历队列中的所有任务
+            for ($i = 0; $i < $queueLength; $i++) {
+                $dubTaskId = Redis::lindex('dub_video_task_queue', $i);
+                if (!$dubTaskId) continue;
+                
+                // 查询任务状态
+                $dubTask = DB::table('mp_dub_video_tasks')
+                    ->where('id', $dubTaskId)
+                    ->first();
+                
+                if (!$dubTask) {
+                    // 任务不存在,标记为需要删除
+                    $processedTaskIds[] = $dubTaskId;
+                    continue;
+                }
+                
+                // 如果任务状态是已完成
+                if ($dubTask->generate_status === '已完成') {
+                    // 获取对应的分镜信息
+                    $segment = DB::table('mp_episode_segments')
+                        ->where('segment_id', $dubTask->alias_segment_id)
+                        ->first();
+                    
+                    // 如果分镜存在且audio_duration大于0
+                    if ($segment && isset($segment->audio_duration) && $segment->audio_duration > 0) {
+                        // 更新video_time_point_end字段
+                        DB::table('mp_episode_segments')
+                            ->where('segment_id', $dubTask->alias_segment_id)
+                            ->update([
+                                'video_time_point_end' => $segment->audio_duration,
+                                'updated_at' => date('Y-m-d H:i:s')
+                            ]);
+                        
+                        dLog('anime')->info('更新分镜视频截止时间点', [
+                            'task_id' => $dubTaskId,
+                            'segment_id' => $dubTask->alias_segment_id,
+                            'audio_duration' => $segment->audio_duration
+                        ]);
+                    }
+                    
+                    // 标记为需要从队列中删除
+                    $processedTaskIds[] = $dubTaskId;
+                }
+            }
+            
+            // 从Redis列表中删除已处理的任务ID
+            foreach ($processedTaskIds as $taskId) {
+                Redis::lrem('dub_video_task_queue', 0, $taskId);
+            }
+        }
+    }
 }

+ 3 - 0
app/Services/Anime/AnimeService.php

@@ -2446,6 +2446,9 @@ class AnimeService
                         dLog('anime')->error('创建配音任务失败', ['segment_id' => $sid]);
                         continue;
                     }
+
+                    // 将任务ID添加到Redis列表中
+                    Redis::lpush('dub_video_task_queue', $dubTaskId);
                     
                     // 请求远程服务器执行生成
                     try {