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)); }