예제 #1
0
        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));
        }
예제 #2
0
        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));
        }
예제 #3
0
        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));
        }
예제 #4
0
        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);
                    }
                }
            }
        }