通过分镜json剪辑视频
This commit is contained in:
78
model/dto/video/cut_dto.go
Normal file
78
model/dto/video/cut_dto.go
Normal file
@@ -0,0 +1,78 @@
|
||||
package video
|
||||
|
||||
import "github.com/gogf/gf/v2/frame/g"
|
||||
|
||||
// CutScene 单个分镜场景
|
||||
// 同时兼容两种格式:
|
||||
// 1. 完整格式: {"sceneIndex":1,"startTimeStr":"00:00:00.000","endTimeStr":"00:00:03.115", ...}
|
||||
// 2. 简化格式: {"start": 1.5, "end": 5.0}
|
||||
type CutScene struct {
|
||||
SceneIndex int `json:"sceneIndex" dc:"场景序号"`
|
||||
StartTimeStr string `json:"startTimeStr" dc:"起始时间 HH:MM:SS.mmm"`
|
||||
EndTimeStr string `json:"endTimeStr" dc:"结束时间 HH:MM:SS.mmm"`
|
||||
Start float64 `json:"start" dc:"起始时间(秒)"`
|
||||
End float64 `json:"end" dc:"结束时间(秒)"`
|
||||
DurationStr string `json:"durationStr" dc:"时长"`
|
||||
ShotType string `json:"shotType" dc:"镜头类型"`
|
||||
Composition string `json:"composition" dc:"构图"`
|
||||
NarrativePos string `json:"narrativePos" dc:"叙事位置"`
|
||||
Description string `json:"description" dc:"描述"`
|
||||
}
|
||||
|
||||
// CutReq 视频分镜剪切请求(URL 方式)
|
||||
type CutReq struct {
|
||||
g.Meta `path:"/video/cut" method:"post" tags:"视频剪切" summary:"视频分镜剪切(URL模式)" dc:"根据分镜JSON从视频中剪切多个片段并拼接输出"`
|
||||
VideoURL string `json:"video_url" v:"required#视频URL不能为空" dc:"原始视频URL"`
|
||||
Scenes []CutScene `json:"scenes" v:"required#分镜片段不能为空" dc:"分镜片段数组"`
|
||||
TotalScenes int `json:"totalScenes" dc:"总分镜数"`
|
||||
DurationStr string `json:"durationStr" dc:"总时长"`
|
||||
Upload bool `json:"upload" dc:"是否上传到MinIO" d:"false"`
|
||||
}
|
||||
|
||||
// CutAsyncReq 视频分镜剪切-异步请求(URL方式)
|
||||
type CutAsyncReq struct {
|
||||
g.Meta `path:"/video/cut/async" method:"post" tags:"视频剪切" summary:"视频分镜剪切-异步(URL模式)" dc:"异步根据分镜JSON剪切视频,立即返回taskId,完成后通过callback_url通知结果"`
|
||||
VideoURL string `json:"video_url" v:"required#视频URL不能为空" dc:"原始视频URL"`
|
||||
Scenes []CutScene `json:"scenes" v:"required#分镜片段不能为空" dc:"分镜片段数组"`
|
||||
TotalScenes int `json:"totalScenes" dc:"总分镜数"`
|
||||
DurationStr string `json:"durationStr" dc:"总时长"`
|
||||
Upload bool `json:"upload" dc:"是否上传到MinIO" d:"false"`
|
||||
CallbackURL string `json:"callback_url" v:"required#回调地址不能为空" dc:"回调地址,剪切完成后POST结果到该地址"`
|
||||
}
|
||||
|
||||
// CutRes 视频分镜剪切响应
|
||||
type CutRes struct {
|
||||
OutputPath string `json:"outputPath" dc:"输出文件路径"`
|
||||
FileSize int64 `json:"fileSize" dc:"文件大小(字节)"`
|
||||
Duration float64 `json:"duration" dc:"总时长(秒)"`
|
||||
DurationStr string `json:"durationStr" dc:"可读时长"`
|
||||
ShotsCount int `json:"shotsCount" dc:"输出片段数"`
|
||||
FileURL string `json:"fileURL" dc:"MinIO访问地址(上传后返回)"`
|
||||
}
|
||||
|
||||
// ---------- 异步剪切任务 ----------
|
||||
|
||||
// CreateCutTaskRes 创建异步剪切任务响应
|
||||
type CreateCutTaskRes struct {
|
||||
TaskID string `json:"taskId" dc:"任务ID"`
|
||||
}
|
||||
|
||||
// GetCutTaskReq 查询异步剪切任务请求
|
||||
type GetCutTaskReq struct {
|
||||
g.Meta `path:"/video/cut/task/{taskId}" method:"get" tags:"视频剪切" summary:"查询剪切任务结果" dc:"根据taskId查询异步剪切任务的结果"`
|
||||
TaskID string `json:"taskId" dc:"任务ID"`
|
||||
}
|
||||
|
||||
// GetCutTaskRes 查询异步剪切任务响应
|
||||
type GetCutTaskRes struct {
|
||||
TaskID string `json:"taskId" dc:"任务ID"`
|
||||
Status string `json:"status" dc:"状态: pending/running/success/failed"`
|
||||
FileURL string `json:"fileURL,omitempty" dc:"MinIO文件访问路径"`
|
||||
FileSize int64 `json:"fileSize,omitempty" dc:"文件大小(字节)"`
|
||||
FileName string `json:"fileName,omitempty" dc:"文件名"`
|
||||
FileFormat string `json:"fileFormat,omitempty" dc:"文件格式"`
|
||||
FileAddressPrefix string `json:"fileAddressPrefix,omitempty" dc:"MinIO地址前缀"`
|
||||
DurationStr string `json:"durationStr,omitempty" dc:"剪切后时长"`
|
||||
ErrorMessage string `json:"errorMessage,omitempty" dc:"错误信息"`
|
||||
CreatedAt int64 `json:"createdAt" dc:"创建时间戳"`
|
||||
}
|
||||
Reference in New Issue
Block a user