-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathNSVideoFilter.cs
More file actions
146 lines (118 loc) · 5.37 KB
/
NSVideoFilter.cs
File metadata and controls
146 lines (118 loc) · 5.37 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
using FFMediaToolkit.Decoding;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;
using System.IO;
using System.Drawing.Imaging;
using System.Drawing;
using Color = System.Drawing.Color;
using System;
using System.Collections.Generic;
using FFMediaToolkit.Encoding;
using FFMediaToolkit.Graphics;
using MediaToolkit;
using MediaToolkit.Options;
namespace GrayScaleFilter
{
static class NSVideoFilter
{
private static string systemDir = System.AppDomain.CurrentDomain.BaseDirectory;
private static string outputImageDir = $"{systemDir}images";
private static string FFmpegPath = $@"{systemDir}ffmpeg";
private static string sOutputCard = "out";
private static string sOutputCardExtension = "mp4";
public static void ConvertVideo(string inputPath, string outputPath, Func<Bitmap, Bitmap> filterFuction)
{
FFMediaToolkit.FFmpegLoader.FFmpegPath = FFmpegPath;
CreateDirectory();
ExtractImages(inputPath, filterFuction);
DeleteOutputFile(outputPath);
CombineImagesToVid(inputPath);
DeleteImageDir();
Console.WriteLine("-----------------------");
Console.WriteLine("Filter Has been applied");
}
public static void ConvertToNeonware(string inputPath, string outputPath)
=> ConvertVideo(inputPath, outputPath, NSBitmapFilter.ConvertToNeonware);
public static void ConvertToGrayscale(string inputPath, string outputPath)
=> ConvertVideo(inputPath, outputPath, NSBitmapFilter.ConvertToGrayscale);
public static string GetDirOutputPath() // For QuickUse
=> $@"{systemDir}{sOutputCard}.{sOutputCardExtension}";
private static void DeleteOutputFile(string filePath)
{
// Deletes Output file if already exists so it can Override it.
if (File.Exists(filePath))
File.Delete(filePath);
}
private static void CreateDirectory()
{
// Creates directory for saving images
if (Directory.Exists(outputImageDir) == false)
{
Console.WriteLine("Images Directory Added");
Directory.CreateDirectory(outputImageDir);
}
else
{
DeleteImageDir();
}
}
private static void DeleteImageDir()
{
// Deletes ./images directory
System.IO.DirectoryInfo di = new DirectoryInfo(outputImageDir);
foreach (FileInfo file in di.GetFiles())
{
file.Delete();
}
foreach (DirectoryInfo dir in di.GetDirectories())
{
dir.Delete(true);
}
Console.WriteLine("Images Directory Emptied");
}
private static void CombineImagesToVid(string fileLocation)
{
// Uses FFMPEG
System.IO.DirectoryInfo directory = new DirectoryInfo(outputImageDir);
FFMediaToolkit.Decoding.MediaFile mediaFile = FFMediaToolkit.Decoding.MediaFile.Open(fileLocation);
FFmpegCommunicator.Start();
Console.WriteLine($"Adding: images to video");
FFmpegCommunicator.Execute($"-i {outputImageDir}\\img%03d.png -pix_fmt yuv420p {sOutputCard}.{sOutputCardExtension}");
FFmpegCommunicator.End();
}
private static int ExtractImages(string fileLocation, Func<Bitmap,Bitmap> filterFunction)
{
// Extracts images to outputImageDir
int frameCount = 1;
FFMediaToolkit.Decoding.MediaFile originalFile = FFMediaToolkit.Decoding.MediaFile.Open(fileLocation);
Console.WriteLine($"Duration: {originalFile.Info.Duration}, FrameCount: {originalFile.Video.Info.NumberOfFrames}, AvgFrameRate: {originalFile.Video.Info.AvgFrameRate}");
while (originalFile.Video.TryGetNextFrame(out FFMediaToolkit.Graphics.ImageData imageData))
{
filterFunction(imageData.ToBitmap()).Save($"{outputImageDir}/img{frameCount++.ToString("000")}.png");
Console.WriteLine($"Exported Image Count: {frameCount - 1}");
}
return frameCount;
}
private static unsafe Bitmap ToBitmap(this FFMediaToolkit.Graphics.ImageData bitmap)
{
// Converts ImageData to Bitmap
// Uses FFMediaToolKit for ImageData
// ImageData -> Bitmap (unsafe)
fixed (byte* p = bitmap.Data)
{
return new Bitmap(bitmap.ImageSize.Width, bitmap.ImageSize.Height, bitmap.Stride, PixelFormat.Format24bppRgb, new System.IntPtr(p));
}
}
private static FFMediaToolkit.Graphics.ImageData ToImageData(this Bitmap bitmap)
{
// Converts Bitmap to ImageData
// Uses FFMediaToolKit for ImageData
// Bitmap -> ImageData (safe)
var rect = new System.Drawing.Rectangle(System.Drawing.Point.Empty, bitmap.Size);
var bitLock = bitmap.LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
FFMediaToolkit.Graphics.ImageData bitmapData = FFMediaToolkit.Graphics.ImageData.FromPointer(bitLock.Scan0,FFMediaToolkit.Graphics.ImagePixelFormat.Bgr24, bitmap.Size);
bitmap.UnlockBits(bitLock);
return bitmapData;
}
}
}