diff --git a/FFMpegCore.Test/ArgumentBuilderTest.cs b/FFMpegCore.Test/ArgumentBuilderTest.cs
index 9dd1b9a..2b605b1 100644
--- a/FFMpegCore.Test/ArgumentBuilderTest.cs
+++ b/FFMpegCore.Test/ArgumentBuilderTest.cs
@@ -3,6 +3,7 @@
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;
using System.Collections.Generic;
+using FFMpegCore.FFMPEG;
namespace FFMpegCore.Test
{
@@ -174,6 +175,37 @@ public void Builder_BuildString_Speed()
Assert.AreEqual(str, "-i \"input.mp4\" -preset fast \"output.mp4\"");
}
+ [TestMethod]
+ public void Builder_BuildString_DrawtextFilter()
+ {
+
+ var container = new ArgumentContainer
+ {
+ new InputArgument("input.mp4"),
+ new DrawTextArgument("Stack Overflow", "/path/to/font.ttf",
+ ("fontcolor", "white"),
+ ("fontsize", "24"),
+ ("box", "1"),
+ ("boxcolor", "black@0.5"),
+ ("boxborderw", "5"),
+ ("x", "(w-text_w)/2"),
+ ("y", "(h-text_h)/2")),
+ new OutputArgument("output.mp4")
+ };
+ var result = new FFMpeg().Convert(container);
+
+ var str = GetArgumentsString(new DrawTextArgument("Stack Overflow", "/path/to/font.ttf",
+ ("fontcolor", "white"),
+ ("fontsize", "24"),
+ ("box", "1"),
+ ("boxcolor", "black@0.5"),
+ ("boxborderw", "5"),
+ ("x", "(w-text_w)/2"),
+ ("y", "(h-text_h)/2")));
+
+ Assert.AreEqual("-i \"input.mp4\" -vf drawtext=\"text='Stack Overflow': fontfile=/path/to/font.ttf: fontcolor=white: fontsize=24: box=1: boxcolor=black@0.5: boxborderw=5: x=(w-text_w)/2: y=(h-text_h)/2\" \"output.mp4\"", str);
+ }
+
[TestMethod]
public void Builder_BuildString_StartNumber()
{
@@ -186,7 +218,7 @@ public void Builder_BuildString_StartNumber()
public void Builder_BuildString_Threads_1()
{
var str = GetArgumentsString(new ThreadsArgument(50));
-
+
Assert.AreEqual(str, "-i \"input.mp4\" -threads 50 \"output.mp4\"");
}
diff --git a/FFMpegCore/FFMPEG/Argument/Atoms/DrawTextArgument.cs b/FFMpegCore/FFMPEG/Argument/Atoms/DrawTextArgument.cs
new file mode 100644
index 0000000..5daf264
--- /dev/null
+++ b/FFMpegCore/FFMPEG/Argument/Atoms/DrawTextArgument.cs
@@ -0,0 +1,31 @@
+using System.Collections.Generic;
+using System.Linq;
+
+namespace FFMpegCore.FFMPEG.Argument
+{
+ ///
+ /// Drawtext video filter argument
+ ///
+ public class DrawTextArgument : Argument>
+ {
+ public DrawTextArgument(string text, string fontPath, params (string, string)[] optionalArguments)
+ : base(new[] {("text", text), ("fontfile", fontPath)}.Concat(optionalArguments))
+ {
+ }
+
+ public override string GetStringValue()
+ {
+ return $"-vf drawtext=\"{string.Join(": ", Value.Select(FormatArgumentPair))}\" ";
+ }
+
+ private static string FormatArgumentPair((string key, string value) pair)
+ {
+ return $"{pair.key}={EncloseIfContainsSpace(pair.value)}";
+ }
+
+ private static string EncloseIfContainsSpace(string input)
+ {
+ return input.Contains(" ") ? $"'{input}'" : input;
+ }
+ }
+}
\ No newline at end of file
diff --git a/FFMpegCore/FFMPEG/FFMpeg.cs b/FFMpegCore/FFMPEG/FFMpeg.cs
index 783530b..be5412d 100644
--- a/FFMpegCore/FFMPEG/FFMpeg.cs
+++ b/FFMpegCore/FFMPEG/FFMpeg.cs
@@ -437,7 +437,7 @@ public VideoInfo ReplaceAudio(VideoInfo source, FileInfo audio, FileInfo output,
return new VideoInfo(output);
}
-
+
public VideoInfo Convert(ArgumentContainer arguments)
{
var output = ((OutputArgument) arguments[typeof(OutputArgument)]).GetAsFileInfo();
diff --git a/FFMpegCore/FFMpegCore.csproj b/FFMpegCore/FFMpegCore.csproj
index 3b45e3c..4bee5f9 100644
--- a/FFMpegCore/FFMpegCore.csproj
+++ b/FFMpegCore/FFMpegCore.csproj
@@ -10,9 +10,9 @@
1.0.12
1.1.0.0
1.1.0.0
- Minor fixes and refactoring
+ Add support for drawtext
8
- 1.1.0
+ 1.2.0
Vlad Jerca, Malte Rosenbjerg
ffmpeg ffprobe convert video audio mediafile resize analyze muxing
GitHub