通过分镜json剪辑视频
This commit is contained in:
@@ -133,6 +133,11 @@ func withUser(ctx context.Context) context.Context {
|
||||
return ctx
|
||||
}
|
||||
|
||||
// 调试:打印 Authorization 头
|
||||
if req := g.RequestFromCtx(ctx); req != nil {
|
||||
g.Log().Debugf(ctx, "[withUser] Authorization头=%q", req.Header.Get("Authorization"))
|
||||
}
|
||||
|
||||
user, err := utils.GetUserInfo(ctx)
|
||||
if err == nil && user != nil && user.TenantId > 0 {
|
||||
g.Log().Infof(ctx, "[用户信息] 从请求头解析到用户: userName=%s, tenantId=%d", user.UserName, user.TenantId)
|
||||
|
||||
92
controller/video/cut_controller.go
Normal file
92
controller/video/cut_controller.go
Normal file
@@ -0,0 +1,92 @@
|
||||
package video
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"os"
|
||||
|
||||
dto "media/model/dto/video"
|
||||
service "media/service/video"
|
||||
|
||||
"github.com/gogf/gf/v2/frame/g"
|
||||
)
|
||||
|
||||
type cut struct{}
|
||||
|
||||
var Cut = new(cut)
|
||||
|
||||
// Cut 视频分镜剪切(URL模式) POST /video/cut
|
||||
func (c *cut) Cut(ctx context.Context, req *dto.CutReq) (res *dto.CutRes, err error) {
|
||||
ctx = withUser(ctx)
|
||||
g.Log().Infof(ctx, "[视频分镜剪切] 收到请求 入参: video_url=%s, total_scenes=%d, upload=%v",
|
||||
req.VideoURL, len(req.Scenes), req.Upload)
|
||||
|
||||
// 下载视频到临时目录
|
||||
tempDir := getTempDir(ctx)
|
||||
os.MkdirAll(tempDir, 0755)
|
||||
|
||||
savePath, err := downloadFromURL(ctx, req.VideoURL, tempDir)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("下载视频失败: %v", err)
|
||||
}
|
||||
defer os.Remove(savePath)
|
||||
|
||||
// 转换分镜为 service 层类型(解析时间字符串为秒)
|
||||
serviceShots, err := service.ConvertScenes(req.Scenes)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("解析分镜失败: %v", err)
|
||||
}
|
||||
if len(serviceShots) == 0 {
|
||||
return nil, fmt.Errorf("没有有效的分镜片段")
|
||||
}
|
||||
|
||||
// 调用服务层
|
||||
svcRes, err := service.Cut.Cut(ctx, &service.CutReq{
|
||||
VideoPath: savePath,
|
||||
Shots: serviceShots,
|
||||
Upload: req.Upload,
|
||||
})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
defer os.Remove(svcRes.OutputPath)
|
||||
|
||||
return &dto.CutRes{
|
||||
OutputPath: svcRes.OutputPath,
|
||||
FileSize: svcRes.FileSize,
|
||||
Duration: svcRes.Duration,
|
||||
DurationStr: svcRes.DurationStr,
|
||||
ShotsCount: svcRes.ShotsCount,
|
||||
FileURL: svcRes.FileURL,
|
||||
}, nil
|
||||
}
|
||||
|
||||
// CutAsync 视频分镜剪切-异步(URL模式) POST /video/cut/async
|
||||
func (c *cut) CutAsync(ctx context.Context, req *dto.CutAsyncReq) (res *dto.CreateCutTaskRes, err error) {
|
||||
ctx = withUser(ctx)
|
||||
g.Log().Infof(ctx, "[视频分镜剪切-异步] 收到请求 入参: video_url=%s, total_scenes=%d, upload=%v, callback=%s",
|
||||
req.VideoURL, len(req.Scenes), req.Upload, req.CallbackURL)
|
||||
|
||||
// 转换分镜为 service 层类型(解析时间字符串为秒)
|
||||
serviceShots, err := service.ConvertScenes(req.Scenes)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("解析分镜失败: %v", err)
|
||||
}
|
||||
if len(serviceShots) == 0 {
|
||||
return nil, fmt.Errorf("没有有效的分镜片段")
|
||||
}
|
||||
|
||||
taskID, taskErr := service.Cut.CreateAsyncTask(ctx, req.VideoURL, serviceShots, req.Upload, req.CallbackURL)
|
||||
if taskErr != nil {
|
||||
return nil, taskErr
|
||||
}
|
||||
|
||||
return &dto.CreateCutTaskRes{TaskID: taskID}, nil
|
||||
}
|
||||
|
||||
// GetCutTask 查询异步剪切任务结果 GET /video/cut/task/{taskId}
|
||||
func (c *cut) GetCutTask(ctx context.Context, req *dto.GetCutTaskReq) (res *dto.GetCutTaskRes, err error) {
|
||||
ctx = withUser(ctx)
|
||||
return service.Cut.GetTaskResult(ctx, req.TaskID)
|
||||
}
|
||||
Reference in New Issue
Block a user