コード例 #1
0
        private async void Deepfry(String inputPath, String outputPath)
        {
            running = true;

            IMediaInfo mediaInfo = await FFmpeg.GetMediaInfo(inputPath).ConfigureAwait(true);

            IStream videoStream = mediaInfo.VideoStreams.FirstOrDefault();
            IStream audioStream = mediaInfo.AudioStreams.FirstOrDefault();

            IConversion c = FFmpeg.Conversions.New();

            c.AddStream(audioStream, videoStream);
            c.SetOutput(outputPath);
            c.SetOverwriteOutput(true);
            c.SetVideoBitrate((long)VideoBitrateSlider.Value);
            c.SetAudioBitrate((long)AudioBitrateSlider.Value);
            c.AddParameter("-filter:v fps=fps=" + FramerateSlider.Value);
            c.OnProgress += (sender, args) => { this.Dispatcher.Invoke(() => {
                    DoubleAnimation anim = new DoubleAnimation(args.Percent, TimeSpan.FromSeconds(0.5));
                    ConversionProgressBar.BeginAnimation(ProgressBar.ValueProperty, anim);
                }); };

            await c.Start().ConfigureAwait(true);

            running = false;
            NotificationBar.MessageQueue.Enqueue("Complete!", "OPEN", new Action(() => Process.Start("explorer.exe", outputPath)));
        }
コード例 #2
0
        public static void randomizeScaleAndAspectRatio(IConversion some)
        {
            int x = randomMod(100, 1000);
            int y = randomMod(100, 1000);

            Random r           = new Random();
            string aspectRatio = r.Next(1, 20) + ":" + r.Next(1, 20);

            some.AddParameter("-vf scale=" + x + ":" + y + ",setdar=" + aspectRatio); // this is just an extra, didnt seem to work in discord ...
        }
コード例 #3
0
        public static async Task <string> Get10k() // revision this later on. Must make mp4 resize to 10k pixel image
        {
            string path = Path.GetTempPath() + "10k10k10k10k10k10k10k10k10k10k10k10k10k10k10k10k10k10k.mp4";

            IConversion c = FFmpeg.Conversions.New();

            c.SetOverwriteOutput(true);
            c.AddParameter("-ss 999 -framerate 1 -i C:\\crasherstest\\10k.png -codec copy -pix_fmt yuv420p " + path);

            await c.Start();

            return(path);
        }
コード例 #4
0
        public static async Task <IConversionResult> webmBreaker(string path)
        {
            string temp = Path.GetTempPath() + Guid.NewGuid().ToString() + ".webm";

            IConversion c = await FFmpeg.Conversions.FromSnippet.ToWebM(path, temp);

            c.SetOverwriteOutput(true);
            // c.SetPixelFormat(randomPixelFormat());
            //  randomizeScaleAndAspectRatio(c);
            c.AddParameter("-vf scale=10000:10000");
            await c.Start();

            IConversion c2 = await FFmpeg.Conversions.FromSnippet.ToMp4(temp, path);

            c2.SetOverwriteOutput(true);
            return(await c2.Start());
        }
コード例 #5
0
        public static async void extractThumbnailAsync(int id)
        {
            //thumbnails extracted from video at second 0
            //three format of thumbnails generated using ffmpeg
            string dir = System.IO.Path.GetDirectoryName(Assembly.GetEntryAssembly().Location).Split("bin")[0];

            string videoPath = string.Format("{0}wwwroot\\videos\\{1}.mp4", dir, id.ToString());

            string[] thumbnailFormats = new string[] { "160x90", "240x135", "320x180" };

            for (int i = 0; i < 3; i++)
            {
                string      thumbnailPath = string.Format("{0}wwwroot/thumbnails/{1}_{2}.webp", dir, id.ToString(), i.ToString());
                IConversion conversion    = await FFmpeg.Conversions.FromSnippet.Snapshot(videoPath, thumbnailPath, TimeSpan.FromSeconds(0));

                IConversionResult result = await conversion.AddParameter(String.Format("-s {0}", thumbnailFormats[i])).Start();
            }
        }
コード例 #6
0
        public static async Task <IConversionResult> gifBreaker(string path)
        {
            string temp = Path.GetTempPath() + Guid.NewGuid().ToString() + ".gif";

            IConversion c = await FFmpeg.Conversions.FromSnippet.ToGif(path, temp, 0);

            c.SetOverwriteOutput(true);
            c.SetPixelFormat(randomPixelFormat());
            randomizeScaleAndAspectRatio(c);
            c.AddParameter($"-ignore_loop 0");

            await c.Start();

            IConversion c2 = await FFmpeg.Conversions.FromSnippet.ToMp4(temp, path);

            c2.SetOverwriteOutput(true);
            return(await c2.Start());
        }
コード例 #7
0
        /// <summary>
        ///     Concat multiple inputVideos.
        /// </summary>
        /// <param name="output">Concatenated inputVideos</param>
        /// <param name="inputVideos">Videos to add</param>
        /// <returns>Conversion result</returns>
        public static Task <IConversionResult> Concatenate(string output, params string[] inputVideos)
        {
            if (inputVideos.Length <= 1)
            {
                throw new ArgumentException("You must provide at least 2 files for the concatenation to work", "inputVideos");
            }

            var mediaInfos = new List <IMediaInfo>();

            IConversion conversion = New();

            foreach (string inputVideo in inputVideos)
            {
                IMediaInfo mediaInfo = AsyncHelper.RunSync(() => MediaInfo.Get(inputVideo));

                mediaInfos.Add(mediaInfo);
                conversion.AddParameter($"-i \"{inputVideo}\" ");
            }
            conversion.AddParameter($"-t 1 -f lavfi -i anullsrc=r=48000:cl=stereo");
            conversion.AddParameter($"-filter_complex \"");

            IVideoStream maxResolutionMedia = mediaInfos.Select(x => x.VideoStreams.OrderByDescending(z => z.Width)
                                                                .First())
                                              .OrderByDescending(x => x.Width)
                                              .First();

            for (var i = 0; i < mediaInfos.Count; i++)
            {
                conversion.AddParameter(
                    $"[{i}:v]scale={maxResolutionMedia.Width}:{maxResolutionMedia.Height},setdar=dar={maxResolutionMedia.Ratio},setpts=PTS-STARTPTS[v{i}]; ");
            }
            for (var i = 0; i < mediaInfos.Count; i++)
            {
                conversion.AddParameter(!mediaInfos[i].AudioStreams.Any() ? $"[v{i}]" : $"[v{i}][{i}:a]");
            }

            conversion.AddParameter($"concat=n={inputVideos.Length}:v=1:a=1 [v] [a]\" -map \"[v]\" -map \"[a]\"");
            conversion.AddParameter($"-aspect {maxResolutionMedia.Ratio}");
            conversion.SetOutput(output);
            return(conversion.Start());
        }
コード例 #8
0
        public async static Task <IConversionResult> buildBrokenMp4From(string input, string output, double crashTiming)
        {
            List <string> badParts = new List <string>();

            try
            {
                writeLine("Getting total Length...");
                TimeSpan totalLength = (await FFmpeg.GetMediaInfo(input)).VideoStreams.ToList().FirstOrDefault().Duration;

                if (totalLength.TotalSeconds <= 1)
                {
                    throw new Exception("The Video has to be longer than 1 second!");
                }

                if (crashTiming < 1 || crashTiming > totalLength.TotalSeconds)
                {
                    throw new Exception("The Crash Timing cannot be before the first second and cannot exceed the total length of the Video!");
                }

                writeLine("Checking for Files...");

                #region Generate View-Able portion of the video
                writeLine("Generating View-Able Part...");
                IConversion good = await FFmpeg.Conversions.FromSnippet.Split(input, goodSample, TimeSpan.Zero, TimeSpan.FromSeconds(crashTiming));

                good.SetPixelFormat(PixelFormat.yuv420p);
                good.SetOverwriteOutput(true);
                IConversionResult goodResult = await good.Start();

                #endregion


                #region Generate multiple broken parts of the Video
                writeLine("Generating Broken Video Parts...");

                {
                    TimeSpan time2workwith = (totalLength - TimeSpan.FromSeconds(crashTiming)) / brokenSamples;

                    TimeSpan position = TimeSpan.FromSeconds(crashTiming);

                    for (int i = 0; i < brokenSamples; i++)
                    {
                        string samplePath = badSample + i + ".mp4";

                        writeLine("> Generating Broken Sample " + (i + 1) + " out of " + brokenSamples);

anotherAttempt:
                        try
                        {
                            await generateBrokenSample(input, samplePath, position, time2workwith);

                            //  await gifBreaker(samplePath);
                        }
                        catch (Exception e)
                        { // in some cases conversion will f**k up, so just try again cuz i cba to filter out which cant be converted
                            if (e is ConversionException)
                            {
                                writeLine(ConsoleColor.Red, "Invalid Conversion occurred. Trying again...", null);
                                Thread.Sleep(1000);
                                goto anotherAttempt;
                            }
                            else
                            {
                                writeLine(ConsoleColor.Red, e, null);
                            }
                        }

                        badParts.Add(samplePath);

                        position += time2workwith;
                    }
                }

                //           badParts.Add(await Get10k());

                #endregion


                #region Files Collection
                writeLine("Creating Files Collection...");

                if (File.Exists(sampleCollection))
                {
                    File.Delete(sampleCollection);
                }

                File.Create(sampleCollection).Close();

                {
                    string content = "file '" + goodSample + "'\n";

                    foreach (string sample in badParts)
                    {
                        content += "file '" + sample + "'\n";
                    }

                    await File.WriteAllTextAsync(sampleCollection, content);
                }
                #endregion


                #region Concat
                writeLine("Merging Files...");

                List <IMediaInfo> mediaInfos = new List <IMediaInfo>();

                IConversion conversion = FFmpeg.Conversions.New();

                conversion.SetOverwriteOutput(true);
                conversion.AddParameter($"-f concat");
                conversion.AddParameter($"-safe 0");
                conversion.AddParameter($"-i \"{sampleCollection}\"");
                conversion.AddParameter($"-codec copy");

                writeLine("Building output...");

                writeLine("File can be found in: ", ConsoleColor.Yellow, output, null);

                return(await conversion.SetOutput(output)
                       .Start());

                #endregion
            }
            catch (Exception e)
            {
                if (e is FFmpegNotFoundException)
                {
                    writeLine(ConsoleColor.Yellow, "FFmpeg not found. You must install FFmpeg before using this Program.");
                    writeLine("Download the executables here: '", ConsoleColor.Red, "https://github.com/BtbN/FFmpeg-Builds/releases", null, "'");
                    writeLine(ConsoleColor.Yellow, "Place the Executables into: ", ConsoleColor.Red, @"C:\FFmpeg\bin", ConsoleColor.Gray);
                }
                else
                {
                    writeLine("An exception was Thrown: ", ConsoleColor.Yellow, e, null);
                }
            }
            finally
            {
                Cleanup();
            }

            return(null);
        }