private EncodingCompletedEventArgs GetEncodingResults(MediaEncoderSettings settings, string finalFile, DateTime?startTime) { // Create encoding result object. EncodingCompletedEventArgs Result = null; if (finalFile == null || File.Exists(finalFile)) { Result = new EncodingCompletedEventArgs(); Result.Settings = settings; Result.OldFileName = settings.FilePath; Result.NewFileName = settings.FinalFile; if (startTime.HasValue) { Result.EncodingTime = DateTime.Now - startTime.Value; } if (finalFile != null) { FileInfo FinalFileInfo = new FileInfo(finalFile); Result.NewFileSize = FinalFileInfo.Length; FinalFileInfo = new FileInfo(settings.FilePath); Result.OldFileSize = FinalFileInfo.Length; } } return(Result); }
//public void FinalizeReplace(EncodingCompletedEventArgs jobInfo) { // EditVideoBusiness EditBusiness = new EditVideoBusiness(); // string RelativePath = jobInfo.OldFileName.StartsWith(Settings.NaturalGroundingFolder) ? jobInfo.OldFileName.Substring(Settings.NaturalGroundingFolder.Length) : jobInfo.OldFileName; // Media EditVideo = EditBusiness.GetVideoByFileName(RelativePath); // System.Threading.Thread.Sleep(200); // Give MPC time to release the file. // string OriginalPath = Path.Combine(Path.GetDirectoryName(jobInfo.OldFileName), "Original", Path.GetFileName(jobInfo.OldFileName)); // string NewPath = Path.ChangeExtension(jobInfo.OldFileName, null) + Path.GetExtension(jobInfo.Settings.FinalFile); // Directory.CreateDirectory(Path.GetDirectoryName(OriginalPath)); // PathManager.SafeMove(jobInfo.OldFileName, OriginalPath); // PathManager.SafeMove(jobInfo.Settings.FinalFile, NewPath); // jobInfo.Settings.FilePath = OriginalPath.Substring(Settings.NaturalGroundingFolder.Length); // if (EditVideo != null) { // EditVideo.FileName = NewPath.Substring(Settings.NaturalGroundingFolder.Length); // EditVideo.Height = null; // EditBusiness.Save(); // } //} public void FinalizeKeep(EncodingCompletedEventArgs jobInfo) { string FinalFile = String.Format("{0} - Encoded.{1}", Path.ChangeExtension(jobInfo.OldFileName, null), jobInfo.Settings.Container); PathManager.SafeMove(jobInfo.NewFileName, FinalFile); }
private void EncoderThread(object obj) { MediaEncoderSettings settings = obj as MediaEncoderSettings; settings.CompletionStatus = CompletionStatus.Success; DateTime StartTime = DateTime.Now; FFmpegConfig.UserInterfaceManager.Start(settings.JobIndex, "Processing Video"); MediaEncoderSegments SegBusiness = PrepareExistingJob(settings); // If merging is completed, SegBusiness==null. If work is completed but not merged, SegBusiness.SegLeft = empty list. if (SegBusiness != null && SegBusiness.SegLeft.Count() > 0) { if (settings.Deshaker && (settings.DeshakerSettings.PrescanAction != PrescanType.Full || !settings.DeshakerSettings.PrescanCompleted)) { settings.DeshakerSettings.PrescanAction = PrescanType.Full; settings.CompletionStatus = GenerateDeshakerLog(settings, settings.InputFile); } if (settings.CompletionStatus == CompletionStatus.Success) { // Encode audio stream Task EncAudio = null; if (settings.HasAudioOptions) { EncAudio = Task.Run(() => EncoderBusiness.EncodeAudio(settings)); } // Encode video stream in segments List <Task <CompletionStatus> > EncTasks = new List <Task <CompletionStatus> >(); if (settings.VideoAction != VideoAction.Copy) { bool Cancel = false; foreach (SegmentInfo seg in SegBusiness.SegLeft) { MediaEncoderSettings EncSettings = settings.Clone(); EncSettings.ResumePos = seg.Start; File.Delete(EncSettings.OutputFile); EncTasks.Add(Task.Run(() => EncoderBusiness.EncodeVideo(EncSettings, seg.Length, SegBusiness.TotalFrames))); // If there are more segments than max parallel instances, wait until some threads finish if (EncTasks.Count >= settings.ParallelProcessing) { Task.WaitAny(EncTasks.ToArray()); foreach (var item in EncTasks.ToArray()) { if (item.IsCompleted) { if (item.Result == CompletionStatus.Success) { EncTasks.Remove(item); } else { settings.CompletionStatus = item.Result; Cancel = true; } } } } if (Cancel) { break; } } } EncAudio?.Wait(); Task.WaitAll(EncTasks.ToArray()); } } else if (settings.CompletionStatus == CompletionStatus.None) { settings.CompletionStatus = CompletionStatus.Success; } if (FFmpegConfig.UserInterfaceManager.AppExited) { return; } // Check if encode is completed. EncodingCompletedEventArgs CompletedArgs = null; if (settings.CompletionStatus == CompletionStatus.Success) { CompletedArgs = FinalizeEncoding(settings, StartTime); if (settings.CompletionStatus == CompletionStatus.Success && CompletedArgs != null) { EncodingCompleted?.Invoke(this, CompletedArgs); } } if (settings.CompletionStatus != CompletionStatus.Success) { CompletedArgs = GetEncodingResults(settings, null, StartTime); if (IsEncoding) { EncodingFailed?.Invoke(this, CompletedArgs); } } if (IsEncoding || settings.CompletionStatus == CompletionStatus.Success) { Application.Current.Dispatcher.Invoke(() => ProcessingQueue.Remove(settings)); } FFmpegConfig.UserInterfaceManager.Stop(settings.JobIndex); // Start next job. if (IsEncoding && ProcessingQueue.Count > 0) { EncoderThread(ProcessingQueue.First()); } JobThread = null; }