视频剪辑和处理

This commit is contained in:
lmk
2026-06-22 09:18:45 +08:00
parent 9bc48060dc
commit 7d4ac82334
34 changed files with 3319 additions and 839 deletions
+37
View File
@@ -0,0 +1,37 @@
-- scene_split_task 场景检测+视频分割异步任务表
CREATE TABLE IF NOT EXISTS scene_split_task (
id BIGSERIAL NOT NULL,
tenant_id BIGINT NOT NULL DEFAULT 0,
task_id VARCHAR(64) NOT NULL,
video_url TEXT NOT NULL DEFAULT '',
status VARCHAR(20) NOT NULL DEFAULT 'pending',
segment_urls TEXT NOT NULL DEFAULT '',
audio_url TEXT NOT NULL DEFAULT '',
scene_count INT NOT NULL DEFAULT 0,
audio_duration DOUBLE PRECISION NOT NULL DEFAULT 0,
video_duration DOUBLE PRECISION NOT NULL DEFAULT 0,
error_message TEXT,
callback_url VARCHAR(500) NOT NULL DEFAULT '',
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
deleted_at TIMESTAMP WITH TIME ZONE,
PRIMARY KEY (id)
);
COMMENT ON TABLE scene_split_task IS '场景检测+视频分割异步任务表';
COMMENT ON COLUMN scene_split_task.task_id IS '任务唯一标识';
COMMENT ON COLUMN scene_split_task.video_url IS '原始视频URL';
COMMENT ON COLUMN scene_split_task.status IS '任务状态:pending/running/success/failed';
COMMENT ON COLUMN scene_split_task.segment_urls IS '分割后的视频分片URL列表(JSON数组)';
COMMENT ON COLUMN scene_split_task.audio_url IS '提取的音频URL';
COMMENT ON COLUMN scene_split_task.scene_count IS '检测到的场景数/分片数';
COMMENT ON COLUMN scene_split_task.audio_duration IS '音频时长(秒)';
COMMENT ON COLUMN scene_split_task.error_message IS '错误信息';
COMMENT ON COLUMN scene_split_task.callback_url IS '回调地址';
COMMENT ON COLUMN scene_split_task.created_at IS '创建时间';
COMMENT ON COLUMN scene_split_task.updated_at IS '更新时间';
COMMENT ON COLUMN scene_split_task.deleted_at IS '删除时间(软删除)';
CREATE UNIQUE INDEX IF NOT EXISTS idx_scene_split_task_id ON scene_split_task(task_id);
CREATE INDEX IF NOT EXISTS idx_scene_split_status ON scene_split_task(status);
CREATE INDEX IF NOT EXISTS idx_scene_split_created_at ON scene_split_task(created_at);
+4
View File
@@ -0,0 +1,4 @@
-- scene_split_task 增加 video_duration 字段
ALTER TABLE scene_split_task ADD COLUMN IF NOT EXISTS video_duration DOUBLE PRECISION NOT NULL DEFAULT 0;
COMMENT ON COLUMN scene_split_task.video_duration IS '视频总时长(秒)';
+42
View File
@@ -0,0 +1,42 @@
-- video_audio_merge_task 视频拼接+混音异步任务表
CREATE TABLE IF NOT EXISTS video_audio_merge_task (
id BIGSERIAL NOT NULL,
tenant_id BIGINT NOT NULL DEFAULT 0,
task_id VARCHAR(64) NOT NULL,
video_urls TEXT NOT NULL DEFAULT '',
audio_urls TEXT NOT NULL DEFAULT '',
status VARCHAR(20) NOT NULL DEFAULT 'pending',
file_url TEXT NOT NULL DEFAULT '',
file_size BIGINT NOT NULL DEFAULT 0,
file_name VARCHAR(255) NOT NULL DEFAULT '',
file_format VARCHAR(32) NOT NULL DEFAULT '',
file_address_prefix TEXT NOT NULL DEFAULT '',
duration_str VARCHAR(32) NOT NULL DEFAULT '',
error_message TEXT,
callback_url VARCHAR(500) NOT NULL DEFAULT '',
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
deleted_at TIMESTAMP WITH TIME ZONE,
PRIMARY KEY (id)
);
COMMENT ON TABLE video_audio_merge_task IS '视频拼接+混音异步任务表';
COMMENT ON COLUMN video_audio_merge_task.task_id IS '任务唯一标识';
COMMENT ON COLUMN video_audio_merge_task.video_urls IS '视频URL列表(JSON数组)';
COMMENT ON COLUMN video_audio_merge_task.audio_urls IS '音频URL列表(JSON数组)';
COMMENT ON COLUMN video_audio_merge_task.status IS '任务状态:pending/running/success/failed';
COMMENT ON COLUMN video_audio_merge_task.file_url IS 'MinIO文件访问路径';
COMMENT ON COLUMN video_audio_merge_task.file_size IS '文件大小(字节)';
COMMENT ON COLUMN video_audio_merge_task.file_name IS '文件名';
COMMENT ON COLUMN video_audio_merge_task.file_format IS '文件格式';
COMMENT ON COLUMN video_audio_merge_task.file_address_prefix IS 'MinIO地址前缀';
COMMENT ON COLUMN video_audio_merge_task.duration_str IS '合并后视频时长';
COMMENT ON COLUMN video_audio_merge_task.error_message IS '错误信息';
COMMENT ON COLUMN video_audio_merge_task.callback_url IS '回调地址';
COMMENT ON COLUMN video_audio_merge_task.created_at IS '创建时间';
COMMENT ON COLUMN video_audio_merge_task.updated_at IS '更新时间';
COMMENT ON COLUMN video_audio_merge_task.deleted_at IS '删除时间(软删除)';
CREATE UNIQUE INDEX IF NOT EXISTS idx_merge_task_task_id ON video_audio_merge_task(task_id);
CREATE INDEX IF NOT EXISTS idx_merge_task_status ON video_audio_merge_task(status);
CREATE INDEX IF NOT EXISTS idx_merge_task_created_at ON video_audio_merge_task(created_at);
+38
View File
@@ -0,0 +1,38 @@
-- video_caption_task 字幕叠加任务表
-- 使用 HyperFrames (HTML+CSS+Chrome Headless) 渲染带字幕的营销视频
CREATE TABLE IF NOT EXISTS video_caption_task (
id BIGSERIAL PRIMARY KEY,
tenant_id INT8 NOT NULL DEFAULT 0,
task_id VARCHAR(64) NOT NULL UNIQUE, -- 任务唯一标识,前缀 cap_
video_urls TEXT NOT NULL, -- 视频URL列表,JSON数组
audio_url VARCHAR(1024) DEFAULT '', -- 背景音乐URL(可选)
elements TEXT NOT NULL, -- 字幕元素列表,JSON数组
width INT NOT NULL DEFAULT 1080, -- 视频宽度
height INT NOT NULL DEFAULT 1920, -- 视频高度
status VARCHAR(20) NOT NULL DEFAULT 'pending', -- pending/running/success/failed
file_url VARCHAR(1024) DEFAULT '', -- 输出文件URL
file_size INT8 DEFAULT 0, -- 输出文件大小(字节)
file_name VARCHAR(255) DEFAULT '', -- 输出文件名
duration_str VARCHAR(20) DEFAULT '', -- 视频时长
error_message TEXT, -- 错误信息
callback_url VARCHAR(1024) DEFAULT '', -- 回调地址
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
deleted_at TIMESTAMP WITH TIME ZONE DEFAULT NULL
);
COMMENT ON TABLE video_caption_task IS '字幕叠加任务';
COMMENT ON COLUMN video_caption_task.task_id IS '任务唯一标识';
COMMENT ON COLUMN video_caption_task.video_urls IS '背景视频URL列表';
COMMENT ON COLUMN video_caption_task.audio_url IS '背景音乐URL';
COMMENT ON COLUMN video_caption_task.elements IS '字幕/图片元素列表JSON';
COMMENT ON COLUMN video_caption_task.status IS '任务状态:pending/running/success/failed';
COMMENT ON COLUMN video_caption_task.file_url IS '输出文件URL';
COMMENT ON COLUMN video_caption_task.file_size IS '输出文件大小';
COMMENT ON COLUMN video_caption_task.file_name IS '输出文件名';
COMMENT ON COLUMN video_caption_task.duration_str IS '视频时长';
COMMENT ON COLUMN video_caption_task.error_message IS '错误信息';
COMMENT ON COLUMN video_caption_task.callback_url IS '任务完成后回调地址';
CREATE INDEX idx_caption_task_id ON video_caption_task(task_id);
CREATE INDEX idx_caption_status ON video_caption_task(status);