using Encoder.Lib; namespace Encoder; public static class Program { public static void Main(string[] args) { var inputDirectory = new DirectoryInfo("input"); var outputDirectory = new DirectoryInfo("output"); if (!inputDirectory.Exists) { inputDirectory.Create(); } if (!outputDirectory.Exists) { outputDirectory.Create(); } var coreCount = (int) Math.Max(Environment.ProcessorCount / 2, 1); var limitedTaskScheduler = new LimitedConcurrencyLevelTaskScheduler(coreCount); var limitedTaskFactory = new TaskFactory(limitedTaskScheduler); var tasks = new List(); foreach (var file in inputDirectory.EnumerateFiles()) { var task = limitedTaskFactory.StartNew(async () => { // detect volumes. var detectWorker = new DetectWorker("./", file.FullName, "-vn -af volumedetect"); await detectWorker.Run().ConfigureAwait(false); if (string.IsNullOrEmpty(detectWorker.MaxVolume) || string.IsNullOrWhiteSpace(detectWorker.MeanVolume)) { return; } var maxVolumeF = float.Parse(detectWorker.MaxVolume.Substring(0, detectWorker.MaxVolume.Length - 2)); var meanVolumeF = float.Parse(detectWorker.MeanVolume.Substring(0, detectWorker.MeanVolume.Length - 2)); var gainVolume = $"{Math.Round(meanVolumeF * 10 / 20 * -1)}dB"; var outputFile = Path.ChangeExtension(Path.Combine(outputDirectory.FullName, file.Name), "m4a"); // encoding EncodeWorker worker = new EncodeWorker("./", file.FullName, outputFile, $"-vn -ac 2 -c:a aac -b:a 256k -ar 48000 -af volume={gainVolume} -f mp4"); await worker.Run().ConfigureAwait(false); }); tasks.Add(task.Unwrap()); } Task.WhenAll(tasks.ToArray()).ConfigureAwait(false).GetAwaiter().GetResult(); } }