From a49e519672599b3a152db2050bef1f1e783f735e Mon Sep 17 00:00:00 2001 From: AndreasS Date: Mon, 21 Jan 2019 23:17:56 +0200 Subject: [PATCH 01/11] Update CommandBuilder.cs --- MediaToolkit src/MediaToolkit/CommandBuilder.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/MediaToolkit src/MediaToolkit/CommandBuilder.cs b/MediaToolkit src/MediaToolkit/CommandBuilder.cs index 127936e..42041df 100644 --- a/MediaToolkit src/MediaToolkit/CommandBuilder.cs +++ b/MediaToolkit src/MediaToolkit/CommandBuilder.cs @@ -79,6 +79,10 @@ private static string Convert(MediaFile inputFile, MediaFile outputFile, Convers // Audio sample rate if (conversionOptions.AudioSampleRate != AudioSampleRate.Default) commandBuilder.AppendFormat(" -ar {0} ", conversionOptions.AudioSampleRate.Remove("Hz")); + + //Audio downmix + if (conversionOptions.AudioDownmix) + commandBuilder.AppendFormat(" -ac 1 "); // Maximum video duration if (conversionOptions.MaxVideoDuration != null) From 1cc8108015b7705d19b1fa7aafe81af31dced92a Mon Sep 17 00:00:00 2001 From: AndreasS Date: Mon, 21 Jan 2019 23:18:35 +0200 Subject: [PATCH 02/11] Update ConversionOptions.cs --- MediaToolkit src/MediaToolkit/Options/ConversionOptions.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/MediaToolkit src/MediaToolkit/Options/ConversionOptions.cs b/MediaToolkit src/MediaToolkit/Options/ConversionOptions.cs index 5b85d48..f79fae6 100644 --- a/MediaToolkit src/MediaToolkit/Options/ConversionOptions.cs +++ b/MediaToolkit src/MediaToolkit/Options/ConversionOptions.cs @@ -38,6 +38,11 @@ public void CutMedia(TimeSpan seekToPosition, TimeSpan length) /// Audio sample rate /// public AudioSampleRate AudioSampleRate = AudioSampleRate.Default; + + /// + /// Audio sample rate + /// + public bool AudioDownmix = false; /// /// The maximum duration @@ -101,4 +106,4 @@ public void CutMedia(TimeSpan seekToPosition, TimeSpan length) public bool BaselineProfile { get; set; } } -} \ No newline at end of file +} From e0b924e31f8c14e2947933c8df08ca84cb90d033 Mon Sep 17 00:00:00 2001 From: AndreasS Date: Tue, 22 Jan 2019 00:29:08 +0200 Subject: [PATCH 03/11] Update FFmpegTask.cs --- MediaToolkit src/MediaToolkit/FFmpegTask.cs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/MediaToolkit src/MediaToolkit/FFmpegTask.cs b/MediaToolkit src/MediaToolkit/FFmpegTask.cs index 2e858d6..12d98f1 100644 --- a/MediaToolkit src/MediaToolkit/FFmpegTask.cs +++ b/MediaToolkit src/MediaToolkit/FFmpegTask.cs @@ -11,6 +11,9 @@ internal enum FFmpegTask GetMetaData, /// An enum constant representing the get thumbnail option. - GetThumbnail + GetThumbnail, + + /// An enum constant representing the extract frames option. + ExtractFrames } -} \ No newline at end of file +} From f024f35612d5bd671689664ef6aec828450d7cf5 Mon Sep 17 00:00:00 2001 From: AndreasS Date: Tue, 22 Jan 2019 00:31:33 +0200 Subject: [PATCH 04/11] Update CommandBuilder.cs --- MediaToolkit src/MediaToolkit/CommandBuilder.cs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/MediaToolkit src/MediaToolkit/CommandBuilder.cs b/MediaToolkit src/MediaToolkit/CommandBuilder.cs index 42041df..f4d5118 100644 --- a/MediaToolkit src/MediaToolkit/CommandBuilder.cs +++ b/MediaToolkit src/MediaToolkit/CommandBuilder.cs @@ -4,6 +4,7 @@ using System; using System.Globalization; using System.Text; +using System.IO; namespace MediaToolkit { @@ -21,6 +22,8 @@ internal static string Serialize(EngineParameters engineParameters) case FFmpegTask.GetThumbnail: return GetThumbnail(engineParameters.InputFile, engineParameters.OutputFile, engineParameters.ConversionOptions); + case FFmpegTask.ExtractFrames: + return ExtractFrames(engineParameters.InputFile); default: throw new ArgumentOutOfRangeException(); } @@ -42,6 +45,16 @@ private static string GetThumbnail(MediaFile inputFile, MediaFile outputFile, Co return commandBuilder.AppendFormat(" \"{0}\" ", outputFile.Filename).ToString(); } + + private static string ExtractFrames(MediaFile inputFile) + { + var commandBuilder = new StringBuilder(); + + commandBuilder.AppendFormat(" -i \"{0}\" ", inputFile.Filename); + + return commandBuilder.AppendFormat(@" -r 1/1 " + Path.GetDirectoryName(inputFile.Filename) + "\\" + "frame%05d.jpg ").ToString(); + + } private static string Convert(MediaFile inputFile, MediaFile outputFile, ConversionOptions conversionOptions) { From a9763a973e3c156cbb449fd41797be4c25665c0a Mon Sep 17 00:00:00 2001 From: AndreasS Date: Tue, 22 Jan 2019 00:32:09 +0200 Subject: [PATCH 05/11] Update Engine.cs --- MediaToolkit src/MediaToolkit/Engine.cs | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/MediaToolkit src/MediaToolkit/Engine.cs b/MediaToolkit src/MediaToolkit/Engine.cs index 6d623aa..fb2a56b 100644 --- a/MediaToolkit src/MediaToolkit/Engine.cs +++ b/MediaToolkit src/MediaToolkit/Engine.cs @@ -119,6 +119,20 @@ public void GetThumbnail(MediaFile inputFile, MediaFile outputFile, ConversionOp this.FFmpegEngine(engineParams); } + /// ------------------------------------------------------------------------------------------------- + /// Extracts all frames from a video. + /// Video file. + public void ExtractFrames(MediaFile inputFile) + { + EngineParameters engineParams = new EngineParameters + { + InputFile = inputFile, + Task = FFmpegTask.ExtractFrames + }; + + this.FFmpegEngine(engineParams); + } + #region Private method - Helpers private void FFmpegEngine(EngineParameters engineParameters) @@ -303,4 +317,4 @@ private void StartFFmpegProcess(EngineParameters engineParameters) } } } -} \ No newline at end of file +} From 866a5768fa05bce0355e6b91b423d052869b6ab9 Mon Sep 17 00:00:00 2001 From: AndreasS Date: Tue, 22 Jan 2019 22:26:15 +0200 Subject: [PATCH 06/11] Update CommandBuilder.cs --- MediaToolkit src/MediaToolkit/CommandBuilder.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MediaToolkit src/MediaToolkit/CommandBuilder.cs b/MediaToolkit src/MediaToolkit/CommandBuilder.cs index f4d5118..ff3f188 100644 --- a/MediaToolkit src/MediaToolkit/CommandBuilder.cs +++ b/MediaToolkit src/MediaToolkit/CommandBuilder.cs @@ -52,7 +52,7 @@ private static string ExtractFrames(MediaFile inputFile) commandBuilder.AppendFormat(" -i \"{0}\" ", inputFile.Filename); - return commandBuilder.AppendFormat(@" -r 1/1 " + Path.GetDirectoryName(inputFile.Filename) + "\\" + "frame%05d.jpg ").ToString(); + return commandBuilder.AppendFormat(" " + Path.GetDirectoryName(inputFile.Filename) + "\\" + "frame%06d.jpg ").ToString(); } From 53b24a954a2de583f4cdca524dc3bc4c709804b2 Mon Sep 17 00:00:00 2001 From: AndreasS Date: Tue, 22 Jan 2019 22:41:39 +0200 Subject: [PATCH 07/11] Update FFmpegTask.cs --- MediaToolkit src/MediaToolkit/FFmpegTask.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/MediaToolkit src/MediaToolkit/FFmpegTask.cs b/MediaToolkit src/MediaToolkit/FFmpegTask.cs index 12d98f1..5ddbfb5 100644 --- a/MediaToolkit src/MediaToolkit/FFmpegTask.cs +++ b/MediaToolkit src/MediaToolkit/FFmpegTask.cs @@ -14,6 +14,9 @@ internal enum FFmpegTask GetThumbnail, /// An enum constant representing the extract frames option. - ExtractFrames + ExtractFrames, + + /// An enum constant representing the convertion of frames to video option. + FramesToVideo } } From dcf539a85a05f696569213626cab1f0fdf43f518 Mon Sep 17 00:00:00 2001 From: AndreasS Date: Tue, 22 Jan 2019 22:42:41 +0200 Subject: [PATCH 08/11] Update EngineParameters.cs --- MediaToolkit src/MediaToolkit/EngineParameters.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/MediaToolkit src/MediaToolkit/EngineParameters.cs b/MediaToolkit src/MediaToolkit/EngineParameters.cs index ee7a984..2ee78e2 100644 --- a/MediaToolkit src/MediaToolkit/EngineParameters.cs +++ b/MediaToolkit src/MediaToolkit/EngineParameters.cs @@ -37,5 +37,10 @@ internal bool HasCustomArguments /// Gets or sets the task. /// The task. internal FFmpegTask Task { get; set; } + + /// ------------------------------------------------------------------------------------------------- + /// Gets or sets the framerate in the FramesToVideo function. + /// The framespersecond. + internal int fps { get; set; } } -} \ No newline at end of file +} From 9cc3b2a0c2f4a4383070981c9b7c1954d997978e Mon Sep 17 00:00:00 2001 From: AndreasS Date: Tue, 22 Jan 2019 22:47:03 +0200 Subject: [PATCH 09/11] Update Engine.cs --- MediaToolkit src/MediaToolkit/Engine.cs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/MediaToolkit src/MediaToolkit/Engine.cs b/MediaToolkit src/MediaToolkit/Engine.cs index fb2a56b..16d91df 100644 --- a/MediaToolkit src/MediaToolkit/Engine.cs +++ b/MediaToolkit src/MediaToolkit/Engine.cs @@ -133,6 +133,24 @@ public void ExtractFrames(MediaFile inputFile) this.FFmpegEngine(engineParams); } + /// ------------------------------------------------------------------------------------------------- + /// Converts images to a video. + /// Input image files. Must have the format "filename"%XXd.jpg/bmp. For example if there are mutiple jpgs in the directory named frame0001.jpg,frame0002.jpg, input would be "frame%04d.jpg. + /// Output video file. + /// Frame rate of output video file. + public void FramesToVideo(MediaFile inputFile, MediaFile outputFile, int fps) + { + EngineParameters engineParams = new EngineParameters + { + InputFile = inputFile, + OutputFile = outputFile, + fps = fps, + Task = FFmpegTask.FramesToVideo + }; + + this.FFmpegEngine(engineParams); + } + #region Private method - Helpers private void FFmpegEngine(EngineParameters engineParameters) From 0d1fe55529d6d2210f5c709b1889036c184febc6 Mon Sep 17 00:00:00 2001 From: AndreasS Date: Tue, 22 Jan 2019 22:47:51 +0200 Subject: [PATCH 10/11] Update CommandBuilder.cs --- MediaToolkit src/MediaToolkit/CommandBuilder.cs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/MediaToolkit src/MediaToolkit/CommandBuilder.cs b/MediaToolkit src/MediaToolkit/CommandBuilder.cs index ff3f188..7b5615f 100644 --- a/MediaToolkit src/MediaToolkit/CommandBuilder.cs +++ b/MediaToolkit src/MediaToolkit/CommandBuilder.cs @@ -24,6 +24,8 @@ internal static string Serialize(EngineParameters engineParameters) return GetThumbnail(engineParameters.InputFile, engineParameters.OutputFile, engineParameters.ConversionOptions); case FFmpegTask.ExtractFrames: return ExtractFrames(engineParameters.InputFile); + case FFmpegTask.FramesToVideo: + return FramesToVideo(engineParameters.InputFile, engineParameters.OutputFile, engineParameters.fps); default: throw new ArgumentOutOfRangeException(); } @@ -55,6 +57,16 @@ private static string ExtractFrames(MediaFile inputFile) return commandBuilder.AppendFormat(" " + Path.GetDirectoryName(inputFile.Filename) + "\\" + "frame%06d.jpg ").ToString(); } + + private static string FramesToVideo(MediaFile inputFile, MediaFile outputFile,int fps) + { + var commandBuilder = new StringBuilder(); + + commandBuilder.AppendFormat(" -framerate {0} -i \"{1}\" ", fps.ToString(), inputFile.Filename); + + return commandBuilder.AppendFormat(" \"{0}\" ", outputFile.Filename).ToString(); + + } private static string Convert(MediaFile inputFile, MediaFile outputFile, ConversionOptions conversionOptions) { From a33075231ff777b7ddf92458d903c7e2d23b260e Mon Sep 17 00:00:00 2001 From: AndreasS Date: Tue, 22 Jan 2019 22:53:32 +0200 Subject: [PATCH 11/11] Update Engine.cs --- MediaToolkit src/MediaToolkit/Engine.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MediaToolkit src/MediaToolkit/Engine.cs b/MediaToolkit src/MediaToolkit/Engine.cs index 16d91df..0e9f950 100644 --- a/MediaToolkit src/MediaToolkit/Engine.cs +++ b/MediaToolkit src/MediaToolkit/Engine.cs @@ -155,7 +155,7 @@ public void FramesToVideo(MediaFile inputFile, MediaFile outputFile, int fps) private void FFmpegEngine(EngineParameters engineParameters) { - if (!engineParameters.InputFile.Filename.StartsWith("http://") && !File.Exists(engineParameters.InputFile.Filename)) + if (!engineParameters.InputFile.Filename.StartsWith("http://") && !File.Exists(engineParameters.InputFile.Filename) &&!engineParameters.InputFile.Filename.Contains("%")) { throw new FileNotFoundException(Resources.Exception_Media_Input_File_Not_Found, engineParameters.InputFile.Filename); }