type AudioConverter struct { tempDir string }
func (ac *AudioConverter) ConvertToOSS(inputURL string, outputFormat string, options map[string]string) (*ConvertToOSSResult, error) { taskID := uuid.New().String() inputPath := filepath.Join(ac.tempDir, fmt.Sprintf("convert_%s_input", taskID)) outputPath := filepath.Join(ac.tempDir, fmt.Sprintf("convert_%s_output.%s", taskID, outputFormat)) defer os.Remove(inputPath) defer os.Remove(outputPath) if err := ac.downloadFile(inputURL, inputPath); err != nil { return nil, fmt.Errorf("failed to download: %w", err) } if err := ac.convertFile(inputPath, outputPath, outputFormat, options); err != nil { return nil, fmt.Errorf("conversion failed: %w", err) } outputData, _ := os.ReadFile(outputPath) duration, _ := ac.getAudioDuration(outputPath) objectKey := oss.GetClient().GenerateObjectKey("music/converted", fmt.Sprintf("%s.%s", baseName, outputFormat)) publicURL, err := oss.GetClient().Upload(objectKey, strings.NewReader(string(outputData)), ac.getContentType(outputFormat)) return &ConvertToOSSResult{ PublicURL: publicURL, Format: outputFormat, Duration: duration, FileSize: int64(len(outputData)), }, nil }
func (ac *AudioConverter) convertFile(inputPath, outputPath, outputFormat string, options map[string]string) error { args := []string{"-i", inputPath, "-y"} switch strings.ToLower(outputFormat) { case "mp3": args = append(args, "-c:a", "libmp3lame", "-q:a", "0") case "flac": args = append(args, "-c:a", "flac") case "wav": args = append(args, "-c:a", "pcm_s16le") case "aac": args = append(args, "-c:a", "aac", "-b:a", "192k") case "ogg": args = append(args, "-c:a", "libvorbis", "-q:a", "4") } args = append(args, outputPath) cmd := exec.Command("ffmpeg", args...) output, err := cmd.CombinedOutput() if err != nil { return fmt.Errorf("ffmpeg error: %v, output: %s", err, string(output)) } return nil }
|
评论
0 条评论