mirror of
https://github.com/n00mkrad/flowframes.git
synced 2025-12-16 08:27:44 +01:00
113 lines
4.1 KiB
C#
113 lines
4.1 KiB
C#
using Flowframes.IO;
|
|
using Flowframes.Magick;
|
|
using Flowframes.Main;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using System.Windows.Forms;
|
|
|
|
namespace Flowframes.UI
|
|
{
|
|
class UtilsTab
|
|
{
|
|
|
|
|
|
public static async Task ExtractVideo(string videoPath, bool withAudio)
|
|
{
|
|
string outPath = Path.ChangeExtension(videoPath, null) + "-extracted";
|
|
Program.mainForm.SetWorking(true);
|
|
await FFmpegCommands.VideoToFrames(videoPath, Path.Combine(outPath, "frames"), false, false, false);
|
|
File.WriteAllText(Path.Combine(outPath, "fps.ini"), Interpolate.currentInFps.ToString());
|
|
if (withAudio)
|
|
await FFmpegCommands.ExtractAudio(videoPath, Path.Combine(outPath, "audio"));
|
|
Program.mainForm.SetWorking(false);
|
|
Logger.Log("Done.");
|
|
}
|
|
|
|
public static async Task LoopVideo (string inputFile, ComboBox loopTimes)
|
|
{
|
|
if (!InputIsValid(inputFile))
|
|
return;
|
|
int times = loopTimes.GetInt();
|
|
Logger.Log("Lopping video " + times + "x...", true);
|
|
await FFmpegCommands.LoopVideo(inputFile, times, false);
|
|
Logger.Log("Done", true);
|
|
}
|
|
|
|
public static async Task ChangeSpeed(string inputFile, ComboBox speed)
|
|
{
|
|
if (!InputIsValid(inputFile))
|
|
return;
|
|
float speedFloat = speed.GetFloat();
|
|
Logger.Log("Creating video with " + speed + "% speed...", true);
|
|
await FFmpegCommands.ChangeSpeed(inputFile, speedFloat, false);
|
|
Logger.Log("Done", true);
|
|
}
|
|
|
|
public static async Task Convert(string inputFile, ComboBox crfBox)
|
|
{
|
|
if (!InputIsValid(inputFile))
|
|
return;
|
|
int crf = crfBox.GetInt();
|
|
Logger.Log("Creating MP4 with CRF " + crf + "...", true);
|
|
if(Formats.noEncodeSupport.Contains(Path.GetExtension(inputFile)))
|
|
await FFmpegCommands.Encode(inputFile, "libx264", "aac", crf, 112, false); // Use AAC if there is no audio enc for this format
|
|
else
|
|
await FFmpegCommands.Encode(inputFile, "libx264", "copy", crf, 0, false); // Copy audio if compatible
|
|
Logger.Log("Done", true);
|
|
}
|
|
|
|
static bool InputIsValid (string inPath)
|
|
{
|
|
bool isFile = !IOUtils.IsPathDirectory(inPath);
|
|
if ((isFile && !IOUtils.IsFileValid(inPath)) || (!isFile && !IOUtils.IsDirValid(inPath)))
|
|
{
|
|
MessageBox.Show("Input path is not valid!");
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
public static async void Dedupe (string inPath, bool testRun)
|
|
{
|
|
bool isFile = !IOUtils.IsPathDirectory(inPath);
|
|
if ((isFile && !IOUtils.IsFileValid(inPath)) || (!isFile && !IOUtils.IsDirValid(inPath)))
|
|
{
|
|
MessageBox.Show("Input path is not valid!");
|
|
return;
|
|
}
|
|
|
|
string framesPath;
|
|
|
|
if (isFile)
|
|
{
|
|
Logger.Log("Input is a file, not directory");
|
|
if (!InterpolateUtils.IsVideoValid(inPath))
|
|
{
|
|
MessageBox.Show("Input file is not valid!", "Error");
|
|
return;
|
|
}
|
|
Program.mainForm.SetWorking(true);
|
|
await Task.Delay(10);
|
|
framesPath = Path.ChangeExtension(inPath, null) + "-frames";
|
|
Directory.CreateDirectory(framesPath);
|
|
await Interpolate.ExtractFrames(inPath, framesPath, false);
|
|
}
|
|
else
|
|
{
|
|
framesPath = inPath;
|
|
}
|
|
Program.mainForm.SetWorking(true);
|
|
Logger.Log("Running frame de-duplication", true);
|
|
await Task.Delay(10);
|
|
await MagickDedupe.Run(framesPath, testRun);
|
|
IOUtils.TryDeleteIfExists(framesPath);
|
|
Program.mainForm.SetProgress(0);
|
|
Program.mainForm.SetWorking(false);
|
|
}
|
|
}
|
|
}
|