public void Cut_Concat_Effect3Videos_Test() { const string OutputFile = OutputFolder + "Cut_Effect_Concat3Videos.avi"; const string FileToConcat1 = OutputFolder + "1EpisodeToConcat_tmp.avi"; const string FileToConcat2 = OutputFolder + "2EpisodeToConcat_tmp.avi"; const string FileToConcat2TW = OutputFolder + "2EpisodeToConcat_tmpTW.avi"; const string FileToConcat3 = OutputFolder + "3EpisodeToConcat_tmp.avi"; string source = Path.Combine(this.InputFolder, SampleFiles.RealInputVideoAVI2); var ffmpeg = new FFMpeg(this.temporaryFilesStorage); var cutOptions1 = FFMpegCutOptions.BuildSimpleCatOptions(source, FileToConcat1, 100, 20, GlobalExportProgress.Empty); ffmpeg.Cut(cutOptions1); var cutOptions2 = FFMpegCutOptions.BuildSimpleCatOptions(source, FileToConcat2, 300, 20, GlobalExportProgress.Empty); ffmpeg.Cut(cutOptions2); var cutOptions3 = FFMpegCutOptions.BuildSimpleCatOptions(source, FileToConcat3, 600, 20, GlobalExportProgress.Empty); ffmpeg.Cut(cutOptions3); ffmpeg.Concat(OutputFile, "copy", "copy", GlobalExportProgress.Empty, FileToConcat1, FileToConcat2, FileToConcat3); ffmpeg.ApplyTimeWarp(OutputFile, new List <TimeWarpRecord> { new TimeWarpRecord(23, 32, 2), new TimeWarpRecord(43, 52, 2) }, FileToConcat2TW, GlobalExportProgress.Empty); Assert.IsTrue(File.Exists(OutputFile)); }
public void Concat4ProblemVideosFromArturas_Test() { const string OutputFile = OutputFolder + "4Episodes60SecConcat_SuperFast.mkv"; const string FileToConcat1 = OutputFolder + "1EpisodeToConcat_SuperFast.mp4"; const string FileToConcat2 = OutputFolder + "2EpisodeToConcat_SuperFast.mp4"; const string FileToConcat3 = OutputFolder + "3EpisodeToConcat_SuperFast.mp4"; const string FileToConcat4 = OutputFolder + "4EpisodeToConcat_SuperFast.mp4"; string Source1 = SampleFiles.RealInputVideoAVI; string Source2 = SampleFiles.RealInputVideoAVI2; var ffmpeg = new FFMpeg(this.temporaryFilesStorage); var cutOptions1 = FFMpegCutOptions.BuildCatOptionsWithConvertations(Source1, FileToConcat1, 300, 20, GlobalExportProgress.Empty, new Size(1280, 720)); ffmpeg.Cut(cutOptions1); var cutOptions2 = FFMpegCutOptions.BuildCatOptionsWithConvertations(Source1, FileToConcat2, 500, 20, GlobalExportProgress.Empty, new Size(1280, 720)); ffmpeg.Cut(cutOptions2); var cutOptions3 = FFMpegCutOptions.BuildCatOptionsWithConvertations(Source2, FileToConcat3, 100, 20, GlobalExportProgress.Empty, new Size(1280, 720)); ffmpeg.Cut(cutOptions3); var cutOptions4 = FFMpegCutOptions.BuildCatOptionsWithConvertations(Source2, FileToConcat4, 300, 20, GlobalExportProgress.Empty, new Size(1280, 720)); ffmpeg.Cut(cutOptions4); ffmpeg.Concat(OutputFile, "copy", "copy", GlobalExportProgress.Empty, FileToConcat3, FileToConcat4, FileToConcat1, FileToConcat2); Assert.IsTrue(File.Exists(OutputFile)); }
public void Cut_Effect_Concat3Videos_Test() { const string OutputFile = OutputFolder + "3Episodes60SecConcat_tmp.avi"; const string FileToConcat1 = OutputFolder + "1EpisodeToConcat_tmp.avi"; const string FileToConcat2 = OutputFolder + "2EpisodeToConcat_tmp.avi"; const string FileToConcat3 = OutputFolder + "3EpisodeToConcat_tmp.avi"; string source = Path.Combine(this.InputFolder, SampleFiles.RealInputVideoAVI2); var ffmpeg = new FFMpeg(this.temporaryFilesStorage); var cutOptions1 = FFMpegCutOptions.BuildCatOptionsWithConvertations(source, FileToConcat1, 900, 20, GlobalExportProgress.Empty, Size.Empty, null, new List <DrawImageTimeRecord>(), new List <TimeWarpRecord>()); ffmpeg.Cut(cutOptions1); var cutOptions2 = FFMpegCutOptions.BuildCatOptionsWithConvertations(source, FileToConcat2, 300, 20, GlobalExportProgress.Empty, Size.Empty, null, new List <DrawImageTimeRecord>(), new List <TimeWarpRecord> { new TimeWarpRecord(3, 12, 2) }); ffmpeg.Cut(cutOptions2); var cutOptions3 = FFMpegCutOptions.BuildCatOptionsWithConvertations(source, FileToConcat3, 600, 20, GlobalExportProgress.Empty, Size.Empty, null, new List <DrawImageTimeRecord>(), new List <TimeWarpRecord> { new TimeWarpRecord(3, 12, 2) }); ffmpeg.Cut(cutOptions3); ffmpeg.Concat(OutputFile, "copy", "copy", GlobalExportProgress.Empty, FileToConcat2, FileToConcat1, FileToConcat3); Assert.IsTrue(File.Exists(OutputFile)); }
public void ProcessRenderOptions() { using (var temporaryFilesStorage = new TemporaryFilesStorage()) { var subject = new Subject <double>(); // ReSharper disable once ImpureMethodCallOnReadonlyValueField // Внутри происходит регистрация через ссылку на родительский CancellationTokenSource. this.cancellationToken.Register(() => subject.OnNext(0)); using (var ffMpeg = new FFMpeg(temporaryFilesStorage, this.rendererProcessPriorityClass, subject.AsObservable())) { ffMpeg.LogMessage($"Started rendering of {this.outputFile}", string.Empty); var cutOptionsBuilder = new CutOptionsBuilder(this.videoRenderOptions, this.outputSize, this.globalExportProgress, temporaryFilesStorage, false); Parallel.ForEach( cutOptionsBuilder.CutOptions, cutOptions => { if (this.cancellationToken.IsCancellationRequested) { this.cancellationToken.ThrowIfCancellationRequested(); } // ReSharper disable once AccessToDisposedClosure // выполнение замыкания всегда будет происходить до Dispose. this.CutAndDrawTextAndDrawImageAndApplyTimeWarp(ffMpeg, cutOptions, temporaryFilesStorage); }); if (cutOptionsBuilder.FilesToConcat.Count == 1) { File.Move(cutOptionsBuilder.FilesToConcat.Single(), this.outputFile); } else { if (this.cancellationToken.IsCancellationRequested) { this.cancellationToken.ThrowIfCancellationRequested(); } var tempFileForConcat = temporaryFilesStorage.GetIntermediateFile(cutOptionsBuilder.OutputExtension); ffMpeg.Concat(tempFileForConcat, this.outputSize, "copy", "copy", this.globalExportProgress, cutOptionsBuilder.FilesToConcat.ToArray()); ffMpeg.Convert(tempFileForConcat, this.outputFile, this.globalExportProgress); } } } }