ConversionService.cs 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. using System;
  2. using System.Diagnostics;
  3. using System.IO;
  4. namespace SlamCross.Services;
  5. public static class ConversionService
  6. {
  7. private static string FfmpegPath => FindFfmpeg();
  8. private static string FindFfmpeg()
  9. {
  10. string[] candidates = ["/usr/bin/ffmpeg", "/usr/local/bin/ffmpeg", "ffmpeg"];
  11. foreach (var c in candidates)
  12. if (File.Exists(c)) return c;
  13. return "ffmpeg";
  14. }
  15. public static void ConvertToWav(string inputFile, string outputFile, int sampleRate, int channels)
  16. {
  17. var psi = new ProcessStartInfo(FfmpegPath)
  18. {
  19. RedirectStandardError = true,
  20. UseShellExecute = false,
  21. CreateNoWindow = true
  22. };
  23. psi.ArgumentList.Add("-y");
  24. psi.ArgumentList.Add("-i"); psi.ArgumentList.Add(inputFile);
  25. psi.ArgumentList.Add("-f"); psi.ArgumentList.Add("wav");
  26. psi.ArgumentList.Add("-flags"); psi.ArgumentList.Add("bitexact");
  27. psi.ArgumentList.Add("-map_metadata"); psi.ArgumentList.Add("-1");
  28. psi.ArgumentList.Add("-vn");
  29. psi.ArgumentList.Add("-acodec"); psi.ArgumentList.Add("pcm_s16le");
  30. psi.ArgumentList.Add("-ar"); psi.ArgumentList.Add(sampleRate.ToString());
  31. psi.ArgumentList.Add("-ac"); psi.ArgumentList.Add(channels.ToString());
  32. psi.ArgumentList.Add(outputFile);
  33. using var proc = Process.Start(psi) ?? throw new Exception("Failed to start ffmpeg");
  34. var err = proc.StandardError.ReadToEnd();
  35. proc.WaitForExit();
  36. if (proc.ExitCode != 0)
  37. throw new Exception($"ffmpeg failed: {err}");
  38. }
  39. }