This commit is contained in:
2026-03-13 00:06:39 +08:00
parent 5972ba1948
commit 83bfe34394
3 changed files with 34 additions and 27 deletions

View File

@@ -32,3 +32,8 @@ disconnectAction:
enabled: false enabled: false
thresholdMinutes: 5 thresholdMinutes: 5
command: "" command: ""
preview:
enabled: true
resolutions:
- 720
- 1080

View File

@@ -64,6 +64,11 @@ type DisconnectActionConfig struct {
Command string `mapstructure:"command"` Command string `mapstructure:"command"`
} }
type PreviewConfig struct {
Enabled bool `mapstructure:"enabled"`
Resolutions []int `mapstructure:"resolutions"`
}
type MainConfig struct { type MainConfig struct {
Api ApiConfig `mapstructure:"api"` Api ApiConfig `mapstructure:"api"`
Record RecordConfig `mapstructure:"record"` Record RecordConfig `mapstructure:"record"`
@@ -71,4 +76,5 @@ type MainConfig struct {
FileName FileNameConfig `mapstructure:"fileName"` FileName FileNameConfig `mapstructure:"fileName"`
Viid ViidConfig `mapstructure:"viid"` Viid ViidConfig `mapstructure:"viid"`
DisconnectAction DisconnectActionConfig `mapstructure:"disconnectAction"` DisconnectAction DisconnectActionConfig `mapstructure:"disconnectAction"`
Preview PreviewConfig `mapstructure:"preview"`
} }

42
main.go
View File

@@ -53,13 +53,17 @@ func startTask(device config.DeviceMapping, task dto.Task) {
zap.String("deviceNo", task.DeviceNo)) zap.String("deviceNo", task.DeviceNo))
// 复制主文件用于异步生成预览,避免阻塞主上传流程 // 复制主文件用于异步生成预览,避免阻塞主上传流程
previewEnabled := config.Config.Preview.Enabled && len(config.Config.Preview.Resolutions) > 0
copyFile := strings.TrimSuffix(fo.URL, ".mp4") + "_copy.mp4" copyFile := strings.TrimSuffix(fo.URL, ".mp4") + "_copy.mp4"
copyErr := copyFileOnDisk(fo.URL, copyFile) var copyErr error
if previewEnabled {
copyErr = copyFileOnDisk(fo.URL, copyFile)
if copyErr != nil { if copyErr != nil {
logger.Warn("复制文件用于预览失败", logger.Warn("复制文件用于预览失败",
zap.String("taskID", task.TaskID), zap.String("taskID", task.TaskID),
zap.Error(copyErr)) zap.Error(copyErr))
} }
}
err = api.UploadTaskFile(ctx, task, *fo) err = api.UploadTaskFile(ctx, task, *fo)
if err != nil { if err != nil {
@@ -69,7 +73,7 @@ func startTask(device config.DeviceMapping, task dto.Task) {
zap.String("deviceNo", task.DeviceNo), zap.String("deviceNo", task.DeviceNo),
zap.Error(err)) zap.Error(err))
api.ReportTaskFailure(ctx, task.TaskID) api.ReportTaskFailure(ctx, task.TaskID)
if copyErr == nil { if previewEnabled && copyErr == nil {
os.Remove(copyFile) os.Remove(copyFile)
} }
return return
@@ -81,7 +85,7 @@ func startTask(device config.DeviceMapping, task dto.Task) {
zap.String("taskID", task.TaskID), zap.String("taskID", task.TaskID),
zap.String("deviceNo", task.DeviceNo), zap.String("deviceNo", task.DeviceNo),
zap.Error(err)) zap.Error(err))
if copyErr == nil { if previewEnabled && copyErr == nil {
os.Remove(copyFile) os.Remove(copyFile)
} }
return return
@@ -91,8 +95,8 @@ func startTask(device config.DeviceMapping, task dto.Task) {
zap.String("taskID", task.TaskID), zap.String("taskID", task.TaskID),
zap.String("deviceNo", task.DeviceNo)) zap.String("deviceNo", task.DeviceNo))
// 异步:从副本压缩720p预览 → 上传 → 上报 // 异步:从副本压缩预览 → 上传 → 上报
if copyErr == nil { if previewEnabled && copyErr == nil {
go uploadPreview(task.TaskID, copyFile) go uploadPreview(task.TaskID, copyFile)
} }
} }
@@ -104,43 +108,35 @@ func uploadPreview(taskID string, copyFile string) {
baseName := strings.TrimSuffix(copyFile, "_copy.mp4") baseName := strings.TrimSuffix(copyFile, "_copy.mp4")
type previewSpec struct { for _, height := range config.Config.Preview.Resolutions {
resolution string resolution := fmt.Sprintf("%dp", height)
height int previewFile := fmt.Sprintf("%s_preview_%s.mp4", baseName, resolution)
} ok, _ := util.CompressVideo(ctx, copyFile, previewFile, height)
specs := []previewSpec{
{"720p", 720},
{"1080p", 1080},
}
for _, spec := range specs {
previewFile := fmt.Sprintf("%s_preview_%s.mp4", baseName, spec.resolution)
ok, _ := util.CompressVideo(ctx, copyFile, previewFile, spec.height)
if !ok { if !ok {
logger.Error("生成预览文件失败", logger.Error("生成预览文件失败",
zap.String("taskID", taskID), zap.String("taskID", taskID),
zap.String("resolution", spec.resolution)) zap.String("resolution", resolution))
continue continue
} }
err := api.UploadPreviewFile(ctx, taskID, previewFile, spec.resolution) err := api.UploadPreviewFile(ctx, taskID, previewFile, resolution)
if err != nil { if err != nil {
logger.Error("上传预览文件失败", logger.Error("上传预览文件失败",
zap.String("taskID", taskID), zap.String("taskID", taskID),
zap.String("resolution", spec.resolution), zap.String("resolution", resolution),
zap.Error(err)) zap.Error(err))
os.Remove(previewFile) os.Remove(previewFile)
continue continue
} }
if !api.ReportPreviewSuccess(ctx, taskID, spec.resolution) { if !api.ReportPreviewSuccess(ctx, taskID, resolution) {
logger.Error("上报预览成功失败", logger.Error("上报预览成功失败",
zap.String("taskID", taskID), zap.String("taskID", taskID),
zap.String("resolution", spec.resolution)) zap.String("resolution", resolution))
continue continue
} }
logger.Info("预览上传成功", logger.Info("预览上传成功",
zap.String("taskID", taskID), zap.String("taskID", taskID),
zap.String("resolution", spec.resolution)) zap.String("resolution", resolution))
} }
span.SetStatus(codes.Ok, "预览处理完成") span.SetStatus(codes.Ok, "预览处理完成")