Files
sim-link/server/routes/transcoder.go

46 lines
1.2 KiB
Go

package routes
import (
"log"
"os"
"os/exec"
"path/filepath"
"strings"
)
func TranscodeIfNeeded(simDir, filename string) string {
ext := strings.ToLower(filepath.Ext(filename))
if ext != ".avi" {
return filename
}
baseName := strings.TrimSuffix(filename, filepath.Ext(filename))
mp4Filename := baseName + ".mp4"
aviPath := filepath.Join(simDir, filename)
mp4Path := filepath.Join(simDir, mp4Filename)
if _, err := os.Stat(mp4Path); err == nil {
os.Remove(aviPath)
return mp4Filename
}
log.Printf("Attempting GPU Transcoding (h264_nvenc) %s to %s...\n", aviPath, mp4Path)
cmdGPU := exec.Command("ffmpeg", "-y", "-i", aviPath, "-c:v", "h264_nvenc", "-pix_fmt", "yuv420p", "-movflags", "+faststart", mp4Path)
if err := cmdGPU.Run(); err == nil {
os.Remove(aviPath)
return mp4Filename
}
log.Printf("GPU transcoding failed/unavailable, falling back to CPU (libx264) for %s...\n", aviPath)
cmdCPU := exec.Command("ffmpeg", "-y", "-i", aviPath, "-c:v", "libx264", "-pix_fmt", "yuv420p", "-movflags", "+faststart", mp4Path)
if err := cmdCPU.Run(); err == nil {
os.Remove(aviPath)
return mp4Filename
} else {
log.Println("Failed to transcode (both GPU and CPU):", err)
return filename
}
}