package vision import ( "fmt" "image/color" "os" "os/exec" "path/filepath" "testing" "github.com/fogleman/gg" ) func TestPreviewer(t *testing.T) { // 1. 创建测试环境 tmpDir, err := os.MkdirTemp("", "vision_test") if err != nil { t.Fatal(err) } defer os.RemoveAll(tmpDir) videoPath := filepath.Join(tmpDir, "test.mp4") webPPath := filepath.Join(tmpDir, "preview.webp") oggPath := filepath.Join(tmpDir, "preview.ogg") // 2. 模拟生成素材 (生成 5 张纯色帧图片用于合成视频) imgPattern := filepath.Join(tmpDir, "frame_%d.png") for i := 0; i < 5; i++ { dc := gg.NewContext(320, 240) dc.SetColor(color.RGBA{uint8(i * 50), 100, 200, 255}) dc.Clear() dc.SavePNG(fmt.Sprintf(imgPattern, i)) } // 使用现有的 vision.Video 逻辑生成视频 v, err := NewVideo() if err != nil { t.Fatal(err) } // 这里通过 ffmpeg 拼接图片并添加一个静音音频产生视频 err = v.CreateVideoFromImages(filepath.Join(tmpDir, "frame_%d.png"), 1, videoPath) if err != nil { t.Skip("FFmpeg video generation failed, skipping integration test") } // 为测试视频添加静音音频,否则提取音频会失败 audioPath := filepath.Join(tmpDir, "silent.aac") err = exec.Command("ffmpeg", "-f", "lavfi", "-i", "anullsrc=r=44100:cl=mono", "-t", "5", "-c:a", "aac", audioPath).Run() if err == nil { finalVideo := filepath.Join(tmpDir, "final.mp4") exec.Command("ffmpeg", "-i", videoPath, "-i", audioPath, "-c", "copy", finalVideo).Run() videoPath = finalVideo } // 3. 测试 Preview 功能 t.Run("GenerateImagePreview", func(t *testing.T) { imgPath := filepath.Join(tmpDir, "frame_0.png") previewImgPath := filepath.Join(tmpDir, "img_preview.webp") err := GenerateImagePreview(imgPath, previewImgPath, 100, 100) if err != nil { t.Errorf("GenerateImagePreview failed: %v", err) } if _, err := os.Stat(previewImgPath); os.IsNotExist(err) { t.Error("Image preview output not created") } }) t.Run("GenerateVideoPreview", func(t *testing.T) { err := GenerateVideoPreview(videoPath, webPPath, 160, 120) if err != nil { t.Errorf("GenerateVideoPreview failed: %v", err) } if _, err := os.Stat(webPPath); os.IsNotExist(err) { t.Error("WebP output not created") } }) t.Run("GenerateAudioPreview", func(t *testing.T) { err := GenerateAudioPreview(videoPath, oggPath) if err != nil { t.Errorf("GenerateAudioPreview failed: %v", err) } if _, err := os.Stat(oggPath); os.IsNotExist(err) { t.Error("Ogg output not created") } }) }