添加视频帧提取功能和阿里云OSS存储支持

- 新增从视频素材提取首帧/尾帧的功能,支持画面连续性编辑
- 添加阿里云OSS存储支持,可配置本地或OSS存储方式
- 导入视频素材时自动探测并更新视频时长信息
- 前端添加从素材提取尾帧的UI界面
- 添加FramePrompt模型的数据库迁移

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
empty
2026-01-18 21:44:39 +08:00
parent fe595db96e
commit d970107a34
13 changed files with 351 additions and 19 deletions

View File

@@ -20,7 +20,7 @@ type AssetHandler struct {
func NewAssetHandler(db *gorm.DB, cfg *config.Config, log *logger.Logger) *AssetHandler {
return &AssetHandler{
assetService: services.NewAssetService(db, log),
assetService: services.NewAssetService(db, log, cfg),
log: log,
}
}
@@ -218,3 +218,27 @@ func (h *AssetHandler) ImportFromVideoGen(c *gin.Context) {
response.Success(c, asset)
}
// ExtractFrame 从视频素材中提取帧
func (h *AssetHandler) ExtractFrame(c *gin.Context) {
assetID, err := strconv.ParseUint(c.Param("id"), 10, 32)
if err != nil {
response.BadRequest(c, "无效的ID")
return
}
var req services.ExtractFrameRequest
if err := c.ShouldBindJSON(&req); err != nil {
response.BadRequest(c, err.Error())
return
}
imageGen, err := h.assetService.ExtractFrameFromAsset(uint(assetID), &req)
if err != nil {
h.log.Errorw("Failed to extract frame", "error", err, "asset_id", assetID)
response.InternalError(c, err.Error())
return
}
response.Success(c, imageGen)
}

View File

@@ -180,6 +180,7 @@ func SetupRouter(cfg *config.Config, db *gorm.DB, log *logger.Logger, localStora
assets.DELETE("/:id", assetHandler.DeleteAsset)
assets.POST("/import/image/:image_gen_id", assetHandler.ImportFromImageGen)
assets.POST("/import/video/:video_gen_id", assetHandler.ImportFromVideoGen)
assets.POST("/:id/extract-frame", assetHandler.ExtractFrame)
}
storyboards := api.Group("/storyboards")