public async Task MuxingJobTest()
        {
            File.Copy(MuxTestAudioFile, _sourceMuxTestAudioFile);
            File.Copy(MuxTestVideoFile, _sourceMuxTestVideoFile);
            Directory.CreateDirectory(_targetTestPath);

            MuxJobRequestModel request = new MuxJobRequestModel()
            {
                AudioSourceFilename = _sourceMuxTestAudioFile,
                VideoSourceFilename = _sourceMuxTestVideoFile,
                DestinationFilename = _targetFileMux,
                Inpoint             = "0",
                Needed       = DateTime.UtcNow,
                OutputFolder = _targetTestPath
            };

            var jobGuid = await _muxJobClient.CreateNewAsync(request);

            bool      done;
            int       maxCount = 240;
            Stopwatch sw       = new Stopwatch();

            Console.WriteLine($"Starting job {jobGuid}");
            sw.Start();
            FfmpegJobModel job;

            do
            {
                job = await _statusClient.GetAsync(jobGuid);

                var runningTask = job.Tasks.FirstOrDefault(t => t.State == FfmpegTaskModelState.InProgress);
                Console.WriteLine($"Jobstatus : {job.State}, time: {sw.ElapsedMilliseconds} ms, filename: {runningTask?.DestinationFilename}, {runningTask?.Progress:0.##} %");
                if (job.State == FfmpegJobModelState.Failed || job.State == FfmpegJobModelState.Canceled || job.State == FfmpegJobModelState.Unknown)
                {
                    throw new Exception($"Error running job. job state: {job.State}");
                }
                done = job.State == FfmpegJobModelState.Done;
                if (!done)
                {
                    Thread.Sleep(1000);
                }
            } while (!done && maxCount-- > 0);

            Assert.That(done, Is.True);
            Console.WriteLine($"Job done, time : {sw.ElapsedMilliseconds} ms ({maxCount})");
            sw.Stop();

            foreach (var target in job.Tasks)
            {
                string fileFullPath = Path.Combine(_targetTestPath, target.DestinationFilename);
                Console.WriteLine("Checking file: " + fileFullPath);
                Assert.That(File.Exists(fileFullPath), Is.True, $"Expected to find transcoded file @ {fileFullPath}");
            }
        }
        public Guid CreateNew(MuxJobRequestModel input)
        {
            if (!ModelState.IsValid)
            {
                throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState));
            }

            var res = HandleNewMuxJob(input);

            _logging.Info($"Created new mux job : {res}");
            return(res);
        }
        private Guid HandleNewMuxJob(MuxJobRequestModel model)
        {
            if (model == null)
            {
                throw new ArgumentNullException(nameof(model));
            }

            var outputFilename = $"{model.OutputFolder}{Path.DirectorySeparatorChar}{model.DestinationFilename}";
            var frameCount     = _helper.GetDuration(model.VideoSourceFilename);

            string arguments = string.Empty;

            if (model.Inpoint > TimeSpan.Zero)
            {
                arguments += $"-ss {model.Inpoint:g} ";
            }
            arguments += $@"-xerror -i ""{model.VideoSourceFilename}"" -i ""{model.AudioSourceFilename}"" -map 0:v:0 -map 1:a:0 -c copy -y ""{outputFilename}""";
            var jobs = new List <FFmpegJob>
            {
                new MuxJob
                {
                    Arguments                  = arguments,
                    State                      = TranscodingJobState.Queued,
                    DestinationFilename        = outputFilename,
                    DestinationDurationSeconds = frameCount
                }
            };
            var request = new MuxJobRequest
            {
                AudioSourceFilename = model.AudioSourceFilename,
                VideoSourceFilename = model.VideoSourceFilename,
                DestinationFilename = model.DestinationFilename,
                OutputFolder        = model.OutputFolder
            };

            return(_repository.Add(request, jobs));
        }