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))); }
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 ... }
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); }
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()); }
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(); } }
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()); }
/// <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()); }
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); }