From 1936c1a73a7fa4e4bc1965ece1f4722e8477e13b Mon Sep 17 00:00:00 2001 From: Jerry Yan <792602257@qq.com> Date: Fri, 27 Feb 2026 17:52:11 +0800 Subject: [PATCH] =?UTF-8?q?feat(video):=20=E6=94=AF=E6=8C=81HEVC=E7=BC=96?= =?UTF-8?q?=E7=A0=81=E8=A7=86=E9=A2=91=E8=BD=AC=E6=8D=A2=E4=B8=BATS?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加GetVideoCodec函数用于检测视频编码格式 - 实现HEVC编码视频的特殊转换逻辑 - 引入convertHevcToTs函数处理HEVC编码视频 - 保持原有MP4格式转换功能的兼容性 - 添加错误处理和日志记录机制 - 集成链路追踪支持视频编解码操作监控 --- util/ffmpeg.go | 42 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/util/ffmpeg.go b/util/ffmpeg.go index fd0d560..603a078 100644 --- a/util/ffmpeg.go +++ b/util/ffmpeg.go @@ -79,7 +79,20 @@ func runFfmpegForMultipleFile1(ctx context.Context, task *dto.FfmpegTask) bool { go func(file *dto.File) { defer wg.Done() tmpFile := path.Join(os.TempDir(), file.Name+strconv.Itoa(rand.Int())+".ts") - result, err := convertMp4ToTs(subCtx, *file, tmpFile) + codec, err := GetVideoCodec(subCtx, file.Url) + if err != nil { + logger.Error("获取视频编码失败", zap.Error(err)) + mu.Lock() + notOk = true + mu.Unlock() + return + } + var result bool + if codec == "hevc" { + result, err = convertHevcToTs(subCtx, *file, tmpFile) + } else { + result, err = convertMp4ToTs(subCtx, *file, tmpFile) + } if err != nil { logger.Error("转码出错", zap.Error(err)) mu.Lock() @@ -466,6 +479,33 @@ func handleFfmpegProcess(ctx context.Context, ffmpegCmd []string) (bool, error) } } +func GetVideoCodec(ctx context.Context, filePath string) (string, error) { + _, span := tracer.Start(ctx, "GetVideoCodec") + defer span.End() + ffprobeCmd := []string{ + "ffprobe", + "-v", "error", + "-select_streams", "v:0", + "-show_entries", "stream=codec_name", + "-of", "default=noprint_wrappers=1:nokey=1", + filePath, + } + span.SetAttributes(attribute.String("ffprobe.cmd", ToJson(ffprobeCmd))) + cmd := exec.Command(ffprobeCmd[0], ffprobeCmd[1:]...) + var out bytes.Buffer + cmd.Stdout = &out + + err := cmd.Run() + if err != nil { + span.SetAttributes(attribute.String("error", err.Error())) + span.SetStatus(codes.Error, "获取视频编码失败") + return "", fmt.Errorf("failed to get video codec: %w", err) + } + codec := strings.TrimSpace(out.String()) + span.SetAttributes(attribute.String("video.codec", codec)) + return codec, nil +} + func GetVideoDuration(ctx context.Context, filePath string) (float64, error) { _, span := tracer.Start(ctx, "GetVideoDuration") defer span.End()