Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        //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);
        }
Ejemplo n.º 3
0
        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;
        }