Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.IO;
- using System.Collections.Generic;
- using System.Linq;
- using System.Diagnostics;
- namespace HydraVideoAssist
- {
- //This is a script for assisted calling of FFMPEG to reduce source video footage without loosing quality.
- //Use case:
- // - Interactively trim source video files of which you only need small parts (e. g. 30 seconds from 10 minutes)
- // - Allows for original file deletion after wanted part is copied to new file and verified by playback.
- // - Set FFMPEG and work directory constatns below, then execute, interact and save space.
- class Program
- {
- const int FilesToDisplay = 64;
- const int TerminalWidth = 72;
- const string FFMPEGExecutableFullName = @"C:\Users\Thebys\Desktop\Apps\ffmpeg-20190517-c3458f0-win64-static\bin\ffmpeg.exe";
- const string WorkingDirectory = "K:\\TEMP RAW";
- static string InputFileFullName = "";
- static string OutputFileFullName = "";
- static int StartTimeSeconds = 0;
- static int DurationTimeSeconds = 0;
- static void Main(string[] args)
- {
- Console.WriteLine("Hello, welcome to Hydra Video Assist!");
- MainMenu();
- }
- private static void MainMenu()
- {
- Console.WriteLine("Process a file or quit? (default: Process...)");
- var MenuActionInput = Console.ReadLine();
- if (string.IsNullOrWhiteSpace(MenuActionInput))
- {
- ProcessFile();
- }
- else
- {
- Environment.Exit(0);
- }
- }
- private static void ProcessFile()
- {
- AskForInputFileName();
- AskForOutputFileName();
- AskToPlayFile(InputFileFullName);
- AskForStartTime();
- AskForDurationTime();
- ExecuteFFMPEG();
- AskToPlayFile(OutputFileFullName);
- AskForOriginalDeletion();
- }
- private static void AskForInputFileName()
- {
- var FileSelectionList = new List<FileInfo>();
- var files = Directory.GetFiles(WorkingDirectory, "*.MOV").OrderBy(f => new FileInfo(f).Length).Reverse().Take(FilesToDisplay);
- foreach (var file in files)
- {
- FileSelectionList.Add(new FileInfo(file));
- }
- var fileIndex = 0;
- foreach (FileInfo file in FileSelectionList)
- {
- Console.WriteLine($"{fileIndex}\t{file.Name.PadRight(TerminalWidth).Substring(0, TerminalWidth)}\t{file.Length / (1024 * 1024)} MB");
- fileIndex++;
- }
- Console.WriteLine("Ok, Now Select file to trim (default: 0):");
- var SelectedInputFileIndex = Console.ReadLine();
- InputFileFullName = FileSelectionList[Convert.ToInt32(SelectedInputFileIndex)].FullName;
- Console.WriteLine($"Input file selected: {InputFileFullName}");
- }
- private static void AskForOutputFileName()
- {
- Console.WriteLine("Please set output file name:");
- var OutputFileNameDir = new FileInfo(InputFileFullName).Directory.FullName; // $"{.}";
- var OutputFileNameAttempt = new FileInfo(InputFileFullName).Name.Split("_20")[0];
- var OutputFileNameExt = new FileInfo(InputFileFullName).Extension;
- var OutputFileNameCandidate = Path.Combine(OutputFileNameDir, $"__{OutputFileNameAttempt}{OutputFileNameExt}");
- Console.WriteLine($"Default: {OutputFileNameCandidate}");
- var OutputFileNameInput = Console.ReadLine();
- if (String.IsNullOrWhiteSpace(OutputFileNameInput))
- {
- OutputFileFullName = OutputFileNameCandidate;
- }
- else
- {
- OutputFileFullName = OutputFileNameInput;
- }
- }
- private static void AskToPlayFile(string FileNameToPlay)
- {
- Console.WriteLine("Would you like to play the file now (default yes)?");
- var ShouldPlayFile = Console.ReadLine();
- if (ShouldPlayFile == "yes" || String.IsNullOrWhiteSpace(ShouldPlayFile))
- {
- try
- {
- new Process
- {
- StartInfo = new ProcessStartInfo(FileNameToPlay)
- {
- UseShellExecute = true
- }
- }.Start();
- }
- catch (Exception e)
- {
- Console.WriteLine($"Failed to play file: {e.Message}");
- }
- }
- }
- private static void AskForStartTime()
- {
- Console.WriteLine("Please enter start time in seconds or type \"r\" to restart, \"d\" to delete:");
- var StartTimeInput = Console.ReadLine();
- if (StartTimeInput == "r") MainMenu();
- if (StartTimeInput == "d") AskForOriginalDeletion();
- else
- {
- StartTimeSeconds = Convert.ToInt32(StartTimeInput);
- }
- }
- private static void AskForDurationTime()
- {
- Console.WriteLine("Please enter duration time in seconds:");
- var DurationTimeInput = Console.ReadLine();
- DurationTimeSeconds = Convert.ToInt32(DurationTimeInput);
- }
- private static void ExecuteFFMPEG()
- {
- Console.WriteLine($"Will run FFMPEG with the following command, looking good?");
- Console.WriteLine($"ffmpeg.exe -ss {StartTimeSeconds} -t {DurationTimeSeconds} -i \"{InputFileFullName}\" -c copy -map 0 \"{OutputFileFullName}\"");
- Console.ReadLine();
- try
- {
- new Process
- {
- StartInfo = new ProcessStartInfo(FFMPEGExecutableFullName)
- {
- UseShellExecute = true,
- Arguments = $"-ss {StartTimeSeconds} -t {DurationTimeSeconds} -i \"{InputFileFullName}\" -c copy -map 0 \"{OutputFileFullName}\""
- }
- }.Start();
- }
- catch (Exception e)
- {
- Console.WriteLine($"Failed to run ffmpeg: {e.Message}");
- }
- }
- private static void AskForOriginalDeletion()
- {
- Console.WriteLine($"Should the original input file be delted?");
- Console.WriteLine($"Default: no. Write \"yes\" to delete.");
- var ShlouldDeleteInputFile = Console.ReadLine();
- if (ShlouldDeleteInputFile == "yes")
- {
- try
- {
- var OriginalfileSize = new FileInfo(InputFileFullName).Length / (1024*1024);
- var NewfileSize = new FileInfo(OutputFileFullName).Length / (1024*1024);
- File.Delete(InputFileFullName);
- Console.WriteLine($"Original input file ({OriginalfileSize} MB) has been deleted.");
- Console.WriteLine($"New file has {NewfileSize} MB, saved {OriginalfileSize - NewfileSize} MB).");
- }
- catch (Exception e)
- {
- Console.WriteLine($"Failed to delete file: {e.Message}");
- Console.WriteLine($"Retry? Default: yes.");
- var RetryFileDeleteInput = Console.ReadLine();
- if (RetryFileDeleteInput == "yes" || string.IsNullOrWhiteSpace(RetryFileDeleteInput))
- {
- AskForOriginalDeletion();
- }
- }
- }
- MainMenu();
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement