using System; using System.Diagnostics; using System.IO; namespace SlamCross.Services; public static class ConversionService { private static string FfmpegPath => FindFfmpeg(); private static string FindFfmpeg() { string[] candidates = ["/usr/bin/ffmpeg", "/usr/local/bin/ffmpeg", "ffmpeg"]; foreach (var c in candidates) if (File.Exists(c)) return c; return "ffmpeg"; } public static void ConvertToWav(string inputFile, string outputFile, int sampleRate, int channels) { var psi = new ProcessStartInfo(FfmpegPath) { RedirectStandardError = true, UseShellExecute = false, CreateNoWindow = true }; psi.ArgumentList.Add("-y"); psi.ArgumentList.Add("-i"); psi.ArgumentList.Add(inputFile); psi.ArgumentList.Add("-f"); psi.ArgumentList.Add("wav"); psi.ArgumentList.Add("-flags"); psi.ArgumentList.Add("bitexact"); psi.ArgumentList.Add("-map_metadata"); psi.ArgumentList.Add("-1"); psi.ArgumentList.Add("-vn"); psi.ArgumentList.Add("-acodec"); psi.ArgumentList.Add("pcm_s16le"); psi.ArgumentList.Add("-ar"); psi.ArgumentList.Add(sampleRate.ToString()); psi.ArgumentList.Add("-ac"); psi.ArgumentList.Add(channels.ToString()); psi.ArgumentList.Add(outputFile); using var proc = Process.Start(psi) ?? throw new Exception("Failed to start ffmpeg"); var err = proc.StandardError.ReadToEnd(); proc.WaitForExit(); if (proc.ExitCode != 0) throw new Exception($"ffmpeg failed: {err}"); } }