|
|
@@ -286,8 +286,79 @@ class AIVideoGenerationService
|
|
|
|
|
|
if ($statusInfo['status'] === 'success') {
|
|
|
$task->updateStatus(MpGenerateVideoTask::STATUS_SUCCESS, $statusInfo);
|
|
|
+
|
|
|
+ // 同步调整分镜视频状态和结果
|
|
|
+ $segment_id = getProp($task, 'alias_segment_id');
|
|
|
+ if ($segment_id && isset($statusInfo['result_url'])) {
|
|
|
+ try {
|
|
|
+ DB::beginTransaction();
|
|
|
+
|
|
|
+ $now = date('Y-m-d H:i:s');
|
|
|
+
|
|
|
+ // 更新分镜表
|
|
|
+ DB::table('mp_episode_segments')->where('segment_id', $segment_id)->update([
|
|
|
+ 'video_url' => $statusInfo['result_url'],
|
|
|
+ 'video_task_status' => '已完成',
|
|
|
+ 'last_frame_url' => $statusInfo['last_frame_url'] ?? '',
|
|
|
+ 'updated_at' => $now
|
|
|
+ ]);
|
|
|
+
|
|
|
+ // 获取分镜信息用于创建配音任务
|
|
|
+ $segment = DB::table('mp_episode_segments')
|
|
|
+ ->where('segment_id', $segment_id)
|
|
|
+ ->select('voice_actor', 'dialogue', 'voice_type', 'voice_name', 'emotion', 'emotion_type', 'gender', 'speed_ratio', 'loudness_ratio', 'emotion_scale', 'pitch')
|
|
|
+ ->first();
|
|
|
+
|
|
|
+ // 如果分镜有对话内容,创建视频配音合成任务
|
|
|
+ if ($segment && !empty($segment->dialogue)) {
|
|
|
+ $generate_json = [
|
|
|
+ 'text' => $segment->dialogue,
|
|
|
+ 'role' => $segment->voice_actor,
|
|
|
+ 'voice_type' => $segment->voice_type,
|
|
|
+ 'voice_name' => $segment->voice_name,
|
|
|
+ 'emotion' => $segment->emotion,
|
|
|
+ 'emotion_type' => $segment->emotion_type,
|
|
|
+ 'gender' => $segment->gender,
|
|
|
+ 'speed_ratio' => $segment->speed_ratio ?? 0,
|
|
|
+ 'loudness_ratio' => $segment->loudness_ratio ?? 0,
|
|
|
+ 'emotion_scale' => $segment->emotion_scale ?? 0,
|
|
|
+ 'pitch' => $segment->pitch ?? 0,
|
|
|
+ ];
|
|
|
+
|
|
|
+ // 插入视频配音合成任务
|
|
|
+ DB::table('mp_dub_video_tasks')->insert([
|
|
|
+ 'alias_segment_id' => $segment_id,
|
|
|
+ 'video_url' => $statusInfo['result_url'],
|
|
|
+ 'generate_status' => '执行中',
|
|
|
+ 'dub_video_url' => '',
|
|
|
+ 'generate_json' => json_encode($generate_json, 256),
|
|
|
+ 'created_at' => $now,
|
|
|
+ 'updated_at' => $now,
|
|
|
+ ]);
|
|
|
+ }
|
|
|
+
|
|
|
+ DB::commit();
|
|
|
+
|
|
|
+ } catch (\Exception $e) {
|
|
|
+ DB::rollBack();
|
|
|
+ dLog('generate')->error('即梦视频任务处理失败', [
|
|
|
+ 'segment_id' => $segment_id,
|
|
|
+ 'task_id' => $task->id,
|
|
|
+ 'error' => $e->getMessage()
|
|
|
+ ]);
|
|
|
+ }
|
|
|
+ }
|
|
|
} elseif ($statusInfo['status'] === 'failed') {
|
|
|
$task->updateStatus(MpGenerateVideoTask::STATUS_FAILED, $statusInfo);
|
|
|
+
|
|
|
+ // 同步更新分镜表状态为失败
|
|
|
+ $segment_id = getProp($task, 'alias_segment_id');
|
|
|
+ if ($segment_id) {
|
|
|
+ DB::table('mp_episode_segments')->where('segment_id', $segment_id)->update([
|
|
|
+ 'video_task_status' => '失败',
|
|
|
+ 'updated_at' => date('Y-m-d H:i:s')
|
|
|
+ ]);
|
|
|
+ }
|
|
|
}
|
|
|
// 如果仍然是处理中状态,不做任何操作
|
|
|
|
|
|
@@ -297,6 +368,15 @@ class AIVideoGenerationService
|
|
|
$task->updateStatus(MpGenerateVideoTask::STATUS_FAILED, [
|
|
|
'error_message' => '任务处理超时(超过12小时)'
|
|
|
]);
|
|
|
+
|
|
|
+ // 同步更新分镜表状态为失败
|
|
|
+ $segment_id = getProp($task, 'alias_segment_id');
|
|
|
+ if ($segment_id) {
|
|
|
+ DB::table('mp_episode_segments')->where('segment_id', $segment_id)->update([
|
|
|
+ 'video_task_status' => '失败',
|
|
|
+ 'updated_at' => date('Y-m-d H:i:s')
|
|
|
+ ]);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -480,20 +560,100 @@ class AIVideoGenerationService
|
|
|
|
|
|
if ($statusInfo['status'] === 'success') {
|
|
|
$task->updateStatus(MpGenerateVideoTask::STATUS_SUCCESS, $statusInfo);
|
|
|
+
|
|
|
+ // 同步调整分镜视频状态和结果
|
|
|
+ $segment_id = getProp($task, 'alias_segment_id');
|
|
|
+ if ($segment_id && isset($statusInfo['result_url'])) {
|
|
|
+ try {
|
|
|
+ DB::beginTransaction();
|
|
|
+
|
|
|
+ $now = date('Y-m-d H:i:s');
|
|
|
+
|
|
|
+ // 更新分镜表
|
|
|
+ DB::table('mp_episode_segments')->where('segment_id', $segment_id)->update([
|
|
|
+ 'video_url' => $statusInfo['result_url'],
|
|
|
+ 'video_task_status' => '已完成',
|
|
|
+ 'last_frame_url' => $statusInfo['last_frame_url'] ?? '',
|
|
|
+ 'updated_at' => $now
|
|
|
+ ]);
|
|
|
+
|
|
|
+ // 获取分镜信息用于创建配音任务
|
|
|
+ $segment = DB::table('mp_episode_segments')
|
|
|
+ ->where('segment_id', $segment_id)
|
|
|
+ ->select('voice_actor', 'dialogue', 'voice_type', 'voice_name', 'emotion', 'emotion_type', 'gender', 'speed_ratio', 'loudness_ratio', 'emotion_scale', 'pitch')
|
|
|
+ ->first();
|
|
|
+
|
|
|
+ // 如果分镜有对话内容,创建视频配音合成任务
|
|
|
+ if ($segment && !empty($segment->dialogue)) {
|
|
|
+ $generate_json = [
|
|
|
+ 'text' => $segment->dialogue,
|
|
|
+ 'role' => $segment->voice_actor,
|
|
|
+ 'voice_type' => $segment->voice_type,
|
|
|
+ 'voice_name' => $segment->voice_name,
|
|
|
+ 'emotion' => $segment->emotion,
|
|
|
+ 'emotion_type' => $segment->emotion_type,
|
|
|
+ 'gender' => $segment->gender,
|
|
|
+ 'speed_ratio' => $segment->speed_ratio ?? 0,
|
|
|
+ 'loudness_ratio' => $segment->loudness_ratio ?? 0,
|
|
|
+ 'emotion_scale' => $segment->emotion_scale ?? 0,
|
|
|
+ 'pitch' => $segment->pitch ?? 0,
|
|
|
+ ];
|
|
|
+
|
|
|
+ // 插入视频配音合成任务
|
|
|
+ DB::table('mp_dub_video_tasks')->insert([
|
|
|
+ 'alias_segment_id' => $segment_id,
|
|
|
+ 'video_url' => $statusInfo['result_url'],
|
|
|
+ 'generate_status' => '执行中',
|
|
|
+ 'dub_video_url' => '',
|
|
|
+ 'generate_json' => json_encode($generate_json, 256),
|
|
|
+ 'created_at' => $now,
|
|
|
+ 'updated_at' => $now,
|
|
|
+ ]);
|
|
|
+ }
|
|
|
+
|
|
|
+ DB::commit();
|
|
|
+
|
|
|
+ } catch (\Exception $e) {
|
|
|
+ DB::rollBack();
|
|
|
+ dLog('generate')->error('Seedance视频任务处理失败', [
|
|
|
+ 'segment_id' => $segment_id,
|
|
|
+ 'task_id' => $task->id,
|
|
|
+ 'error' => $e->getMessage()
|
|
|
+ ]);
|
|
|
+ }
|
|
|
+ }
|
|
|
} elseif ($statusInfo['status'] === 'failed') {
|
|
|
$task->updateStatus(MpGenerateVideoTask::STATUS_FAILED, [
|
|
|
'error_message' => $statusInfo['error_message'],
|
|
|
'result_json' => $statusInfo['result_json'] ?? []
|
|
|
]);
|
|
|
+
|
|
|
+ // 同步更新分镜表状态为失败
|
|
|
+ $segment_id = getProp($task, 'alias_segment_id');
|
|
|
+ if ($segment_id) {
|
|
|
+ DB::table('mp_episode_segments')->where('segment_id', $segment_id)->update([
|
|
|
+ 'video_task_status' => '失败',
|
|
|
+ 'updated_at' => date('Y-m-d H:i:s')
|
|
|
+ ]);
|
|
|
+ }
|
|
|
}
|
|
|
// 如果仍然是处理中状态,不做任何操作
|
|
|
|
|
|
- // 处理:如果任务处理超过12小时,标记为失败
|
|
|
+ // 处理:如果任务处理超过48小时,标记为失败
|
|
|
$processingTime = now()->diffInHours($task->created_at);
|
|
|
if ($processingTime > 48) {
|
|
|
$task->updateStatus(MpGenerateVideoTask::STATUS_FAILED, [
|
|
|
'error_message' => '任务处理超时(超过48小时)'
|
|
|
]);
|
|
|
+
|
|
|
+ // 同步更新分镜表状态为失败
|
|
|
+ $segment_id = getProp($task, 'alias_segment_id');
|
|
|
+ if ($segment_id) {
|
|
|
+ DB::table('mp_episode_segments')->where('segment_id', $segment_id)->update([
|
|
|
+ 'video_task_status' => '失败',
|
|
|
+ 'updated_at' => date('Y-m-d H:i:s')
|
|
|
+ ]);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -1122,11 +1282,82 @@ class AIVideoGenerationService
|
|
|
|
|
|
if ($statusInfo['status'] === 'success') {
|
|
|
$task->updateStatus(MpGenerateVideoTask::STATUS_SUCCESS, $statusInfo);
|
|
|
+
|
|
|
+ // 同步调整分镜视频状态和结果
|
|
|
+ $segment_id = getProp($task, 'alias_segment_id');
|
|
|
+ if ($segment_id && isset($statusInfo['result_url'])) {
|
|
|
+ try {
|
|
|
+ DB::beginTransaction();
|
|
|
+
|
|
|
+ $now = date('Y-m-d H:i:s');
|
|
|
+
|
|
|
+ // 更新分镜表
|
|
|
+ DB::table('mp_episode_segments')->where('segment_id', $segment_id)->update([
|
|
|
+ 'video_url' => $statusInfo['result_url'],
|
|
|
+ 'video_task_status' => '已完成',
|
|
|
+ 'last_frame_url' => $statusInfo['last_frame_url'] ?? '',
|
|
|
+ 'updated_at' => $now
|
|
|
+ ]);
|
|
|
+
|
|
|
+ // 获取分镜信息用于创建配音任务
|
|
|
+ $segment = DB::table('mp_episode_segments')
|
|
|
+ ->where('segment_id', $segment_id)
|
|
|
+ ->select('voice_actor', 'dialogue', 'voice_type', 'voice_name', 'emotion', 'emotion_type', 'gender', 'speed_ratio', 'loudness_ratio', 'emotion_scale', 'pitch')
|
|
|
+ ->first();
|
|
|
+
|
|
|
+ // 如果分镜有对话内容,创建视频配音合成任务
|
|
|
+ if ($segment && !empty($segment->dialogue)) {
|
|
|
+ $generate_json = [
|
|
|
+ 'text' => $segment->dialogue,
|
|
|
+ 'role' => $segment->voice_actor,
|
|
|
+ 'voice_type' => $segment->voice_type,
|
|
|
+ 'voice_name' => $segment->voice_name,
|
|
|
+ 'emotion' => $segment->emotion,
|
|
|
+ 'emotion_type' => $segment->emotion_type,
|
|
|
+ 'gender' => $segment->gender,
|
|
|
+ 'speed_ratio' => $segment->speed_ratio ?? 0,
|
|
|
+ 'loudness_ratio' => $segment->loudness_ratio ?? 0,
|
|
|
+ 'emotion_scale' => $segment->emotion_scale ?? 0,
|
|
|
+ 'pitch' => $segment->pitch ?? 0,
|
|
|
+ ];
|
|
|
+
|
|
|
+ // 插入视频配音合成任务
|
|
|
+ DB::table('mp_dub_video_tasks')->insert([
|
|
|
+ 'alias_segment_id' => $segment_id,
|
|
|
+ 'video_url' => $statusInfo['result_url'],
|
|
|
+ 'generate_status' => '执行中',
|
|
|
+ 'dub_video_url' => '',
|
|
|
+ 'generate_json' => json_encode($generate_json, 256),
|
|
|
+ 'created_at' => $now,
|
|
|
+ 'updated_at' => $now,
|
|
|
+ ]);
|
|
|
+ }
|
|
|
+
|
|
|
+ DB::commit();
|
|
|
+
|
|
|
+ } catch (\Exception $e) {
|
|
|
+ DB::rollBack();
|
|
|
+ dLog('generate')->error('可灵视频任务处理失败', [
|
|
|
+ 'segment_id' => $segment_id,
|
|
|
+ 'task_id' => $task->id,
|
|
|
+ 'error' => $e->getMessage()
|
|
|
+ ]);
|
|
|
+ }
|
|
|
+ }
|
|
|
} elseif ($statusInfo['status'] === 'failed') {
|
|
|
$task->updateStatus(MpGenerateVideoTask::STATUS_FAILED, [
|
|
|
'error_message' => $statusInfo['error_message'],
|
|
|
'result_json' => $statusInfo['result_json'] ?? []
|
|
|
]);
|
|
|
+
|
|
|
+ // 同步更新分镜表状态为失败
|
|
|
+ $segment_id = getProp($task, 'alias_segment_id');
|
|
|
+ if ($segment_id) {
|
|
|
+ DB::table('mp_episode_segments')->where('segment_id', $segment_id)->update([
|
|
|
+ 'video_task_status' => '失败',
|
|
|
+ 'updated_at' => date('Y-m-d H:i:s')
|
|
|
+ ]);
|
|
|
+ }
|
|
|
}
|
|
|
// 如果仍然是处理中状态,不做任何操作
|
|
|
|
|
|
@@ -1136,6 +1367,15 @@ class AIVideoGenerationService
|
|
|
$task->updateStatus(MpGenerateVideoTask::STATUS_FAILED, [
|
|
|
'error_message' => '任务处理超时(超过24小时)'
|
|
|
]);
|
|
|
+
|
|
|
+ // 同步更新分镜表状态为失败
|
|
|
+ $segment_id = getProp($task, 'alias_segment_id');
|
|
|
+ if ($segment_id) {
|
|
|
+ DB::table('mp_episode_segments')->where('segment_id', $segment_id)->update([
|
|
|
+ 'video_task_status' => '失败',
|
|
|
+ 'updated_at' => date('Y-m-d H:i:s')
|
|
|
+ ]);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|