Ejemplo n.º 1
0
        public void Video_Duration()
        {
            var video      = FFProbe.Analyse(TestResources.Mp4Video);
            var outputFile = new TemporaryFile("out.mp4");

            FFMpegArguments
            .FromFileInput(TestResources.Mp4Video)
            .OutputToFile(outputFile, false, opt => opt.WithDuration(TimeSpan.FromSeconds(video.Duration.TotalSeconds - 2)))
            .ProcessSynchronously();

            Assert.IsTrue(File.Exists(outputFile));
            var outputVideo = FFProbe.Analyse(outputFile);

            Assert.AreEqual(video.Duration.Days, outputVideo.Duration.Days);
            Assert.AreEqual(video.Duration.Hours, outputVideo.Duration.Hours);
            Assert.AreEqual(video.Duration.Minutes, outputVideo.Duration.Minutes);
            Assert.AreEqual(video.Duration.Seconds - 2, outputVideo.Duration.Seconds);
        }
Ejemplo n.º 2
0
        public void Video_OutputsData()
        {
            var outputFile   = new TemporaryFile("out.mp4");
            var dataReceived = false;

            FFMpegOptions.Configure(opt => opt.Encoding = Encoding.UTF8);
            var success = FFMpegArguments
                          .FromFileInput(TestResources.Mp4Video)
                          .WithGlobalOptions(options => options
                                             .WithVerbosityLevel(VerbosityLevel.Info))
                          .OutputToFile(outputFile, false, opt => opt
                                        .WithDuration(TimeSpan.FromSeconds(2)))
                          .NotifyOnOutput((_, _) => dataReceived = true)
                          .ProcessSynchronously();

            Assert.IsTrue(dataReceived);
            Assert.IsTrue(success);
            Assert.IsTrue(File.Exists(outputFile));
        }
Ejemplo n.º 3
0
        public void Video_ToMP4_Args_Pipe_DifferentImageSizes()
        {
            using var outputFile = new TemporaryFile($"out{VideoType.Mp4.Extension}");

            var frames = new List <IVideoFrame>
            {
                BitmapSource.CreateVideoFrame(0, System.Drawing.Imaging.PixelFormat.Format24bppRgb, 255, 255, 1, 0),
                BitmapSource.CreateVideoFrame(0, System.Drawing.Imaging.PixelFormat.Format24bppRgb, 256, 256, 1, 0)
            };

            var videoFramesSource = new RawVideoPipeSource(frames);
            var ex = Assert.ThrowsException <FFMpegException>(() => FFMpegArguments
                                                              .FromPipeInput(videoFramesSource)
                                                              .OutputToFile(outputFile, false, opt => opt
                                                                            .WithVideoCodec(VideoCodec.LibX264))
                                                              .ProcessSynchronously());

            Assert.IsInstanceOfType(ex.GetBaseException(), typeof(FFMpegStreamFormatException));
        }
Ejemplo n.º 4
0
        public void Audio_ToAAC_Args_Pipe_ValidDefaultConfiguration()
        {
            using var outputFile = new TemporaryFile($"out{VideoType.Mp4.Extension}");

            var samples = new List <IAudioSample>
            {
                new PcmAudioSampleWrapper(new byte[] { 0, 0 }),
                new PcmAudioSampleWrapper(new byte[] { 0, 0 }),
            };

            var audioSamplesSource = new RawAudioPipeSource(samples);

            var success = FFMpegArguments
                          .FromPipeInput(audioSamplesSource)
                          .OutputToFile(outputFile, false, opt => opt
                                        .WithAudioCodec(AudioCodec.Aac))
                          .ProcessSynchronously();

            Assert.IsTrue(success);
        }
Ejemplo n.º 5
0
        public void ConvertFromPipe(ContainerFormat type, System.Drawing.Imaging.PixelFormat fmt, params IArgument[] arguments)
        {
            using var outputFile = new TemporaryFile($"out{type.Extension}");

            var videoFramesSource = new RawVideoPipeSource(BitmapSource.CreateBitmaps(128, fmt, 256, 256));
            var processor         = FFMpegArguments.FromPipeInput(videoFramesSource).OutputToFile(outputFile, false, opt =>
            {
                foreach (var arg in arguments)
                {
                    opt.WithArgument(arg);
                }
            });
            var scaling = arguments.OfType <ScaleArgument>().FirstOrDefault();

            processor.ProcessSynchronously();

            var outputVideo = FFProbe.Analyse(outputFile);

            Assert.IsTrue(File.Exists(outputFile));

            if (scaling?.Size == null)
            {
                Assert.AreEqual(outputVideo.PrimaryVideoStream.Width, videoFramesSource.Width);
                Assert.AreEqual(outputVideo.PrimaryVideoStream.Height, videoFramesSource.Height);
            }
            else
            {
                if (scaling.Size.Value.Width != -1)
                {
                    Assert.AreEqual(outputVideo.PrimaryVideoStream.Width, scaling.Size.Value.Width);
                }

                if (scaling.Size.Value.Height != -1)
                {
                    Assert.AreEqual(outputVideo.PrimaryVideoStream.Height, scaling.Size.Value.Height);
                }

                Assert.AreNotEqual(outputVideo.PrimaryVideoStream.Width, videoFramesSource.Width);
                Assert.AreNotEqual(outputVideo.PrimaryVideoStream.Height, videoFramesSource.Height);
            }
        }
Ejemplo n.º 6
0
        public bool Convert(ContainerFormat type, bool multithreaded = false, VideoSize size = VideoSize.Original)
        {
            using var outputFile = new TemporaryFile($"out{type.Extension}");

            var input = FFProbe.Analyse(TestResources.Mp4Video);

            FFMpeg.Convert(input, outputFile, type, size: size, multithreaded: multithreaded);
            var outputVideo = FFProbe.Analyse(outputFile);

            Assert.IsTrue(File.Exists(outputFile));
            Assert.AreEqual(outputVideo.Duration.TotalSeconds, input.Duration.TotalSeconds, 0.1);
            if (size == VideoSize.Original)
            {
                Assert.AreEqual(outputVideo.PrimaryVideoStream.Width, input.PrimaryVideoStream.Width);
                Assert.AreEqual(outputVideo.PrimaryVideoStream.Height, input.PrimaryVideoStream.Height);
            }
            else
            {
                Assert.AreNotEqual(outputVideo.PrimaryVideoStream.Width, input.PrimaryVideoStream.Width);
                Assert.AreNotEqual(outputVideo.PrimaryVideoStream.Height, input.PrimaryVideoStream.Height);
                Assert.AreEqual(outputVideo.PrimaryVideoStream.Height, (int)size);
            }

            return(File.Exists(outputFile) &&
                   outputVideo.Duration == input.Duration &&
                   (
                       (
                           size == VideoSize.Original &&
                           outputVideo.PrimaryVideoStream.Width == input.PrimaryVideoStream.Width &&
                           outputVideo.PrimaryVideoStream.Height == input.PrimaryVideoStream.Height
                       ) ||
                       (
                           size != VideoSize.Original &&
                           outputVideo.PrimaryVideoStream.Width != input.PrimaryVideoStream.Width &&
                           outputVideo.PrimaryVideoStream.Height != input.PrimaryVideoStream.Height &&
                           outputVideo.PrimaryVideoStream.Height == (int)size
                       )
                   ));
        }
Ejemplo n.º 7
0
        public void Video_Join()
        {
            var inputCopy = new TemporaryFile("copy-input.mp4");

            File.Copy(TestResources.Mp4Video, inputCopy);

            var outputPath = new TemporaryFile("out.mp4");
            var input      = FFProbe.Analyse(TestResources.Mp4Video);
            var success    = FFMpeg.Join(outputPath, TestResources.Mp4Video, inputCopy);

            Assert.IsTrue(success);
            Assert.IsTrue(File.Exists(outputPath));

            var expectedDuration = input.Duration * 2;
            var result           = FFProbe.Analyse(outputPath);

            Assert.AreEqual(expectedDuration.Days, result.Duration.Days);
            Assert.AreEqual(expectedDuration.Hours, result.Duration.Hours);
            Assert.AreEqual(expectedDuration.Minutes, result.Duration.Minutes);
            Assert.AreEqual(expectedDuration.Seconds, result.Duration.Seconds);
            Assert.AreEqual(input.PrimaryVideoStream.Height, result.PrimaryVideoStream.Height);
            Assert.AreEqual(input.PrimaryVideoStream.Width, result.PrimaryVideoStream.Width);
        }
Ejemplo n.º 8
0
        public async Task Video_Cancel_Async()
        {
            var outputFile = new TemporaryFile("out.mp4");

            var task = FFMpegArguments
                       .FromFileInput("testsrc2=size=320x240[out0]; sine[out1]", false, args => args
                                      .WithCustomArgument("-re")
                                      .ForceFormat("lavfi"))
                       .OutputToFile(outputFile, false, opt => opt
                                     .WithAudioCodec(AudioCodec.Aac)
                                     .WithVideoCodec(VideoCodec.LibX264)
                                     .WithSpeedPreset(Speed.VeryFast))
                       .CancellableThrough(out var cancel)
                       .ProcessAsynchronously(false);

            await Task.Delay(300);

            cancel();

            var result = await task;

            Assert.IsFalse(result);
        }
Ejemplo n.º 9
0
        public async Task Video_Cancel_Async()
        {
            var outputFile = new TemporaryFile("out.mp4");

            var task = FFMpegArguments
                       .FromFileInput(TestResources.Mp4Video)
                       .OutputToFile(outputFile, false, opt => opt
                                     .Resize(new Size(1000, 1000))
                                     .WithAudioCodec(AudioCodec.Aac)
                                     .WithVideoCodec(VideoCodec.LibX264)
                                     .WithConstantRateFactor(14)
                                     .WithSpeedPreset(Speed.VerySlow)
                                     .Loop(3))
                       .CancellableThrough(out var cancel)
                       .ProcessAsynchronously(false);

            await Task.Delay(300);

            cancel();

            var result = await task;

            Assert.IsFalse(result);
        }
Ejemplo n.º 10
0
        public void Video_UpdatesProgress()
        {
            var outputFile = new TemporaryFile("out.mp4");

            var percentageDone = 0.0;
            var timeDone       = TimeSpan.Zero;

            void OnPercentageProgess(double percentage) => percentageDone = percentage;
            void OnTimeProgess(TimeSpan time) => timeDone = time;

            var analysis = FFProbe.Analyse(TestResources.Mp4Video);
            var success  = FFMpegArguments
                           .FromFileInput(TestResources.Mp4Video)
                           .OutputToFile(outputFile, false, opt => opt
                                         .WithDuration(TimeSpan.FromSeconds(2)))
                           .NotifyOnProgress(OnPercentageProgess, analysis.Duration)
                           .NotifyOnProgress(OnTimeProgess)
                           .ProcessSynchronously();

            Assert.IsTrue(success);
            Assert.IsTrue(File.Exists(outputFile));
            Assert.AreNotEqual(0.0, percentageDone);
            Assert.AreNotEqual(TimeSpan.Zero, timeDone);
        }