mirror of
https://github.com/rosenbjerg/FFMpegCore.git
synced 2024-11-10 08:34:12 +01:00
parent
e8dcdc2238
commit
c3b5cd997e
73 changed files with 238 additions and 137 deletions
|
@ -1,7 +1,7 @@
|
||||||
using FFMpegCore.FFMPEG.Argument;
|
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||||
using FFMpegCore.FFMPEG.Enums;
|
|
||||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
|
||||||
using System;
|
using System;
|
||||||
|
using FFMpegCore.Arguments;
|
||||||
|
using FFMpegCore.Enums;
|
||||||
|
|
||||||
namespace FFMpegCore.Test
|
namespace FFMpegCore.Test
|
||||||
{
|
{
|
||||||
|
@ -89,6 +89,76 @@ public void Builder_BuildString_Copy_Both()
|
||||||
Assert.AreEqual("-i \"input.mp4\" -c copy \"output.mp4\"", str);
|
Assert.AreEqual("-i \"input.mp4\" -c copy \"output.mp4\"", str);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[TestMethod]
|
||||||
|
public void Builder_BuildString_DisableChannel_Audio()
|
||||||
|
{
|
||||||
|
var str = FFMpegArguments.FromInputFiles(true, "input.mp4").DisableChannel(Channel.Audio).OutputToFile("output.mp4").Arguments;
|
||||||
|
Assert.AreEqual("-i \"input.mp4\" -an \"output.mp4\"", str);
|
||||||
|
}
|
||||||
|
|
||||||
|
[TestMethod]
|
||||||
|
public void Builder_BuildString_DisableChannel_Video()
|
||||||
|
{
|
||||||
|
var str = FFMpegArguments.FromInputFiles(true, "input.mp4").DisableChannel(Channel.Video).OutputToFile("output.mp4").Arguments;
|
||||||
|
Assert.AreEqual("-i \"input.mp4\" -vn \"output.mp4\"", str);
|
||||||
|
}
|
||||||
|
|
||||||
|
[TestMethod]
|
||||||
|
public void Builder_BuildString_DisableChannel_Both()
|
||||||
|
{
|
||||||
|
var str = FFMpegArguments.FromInputFiles(true, "input.mp4").DisableChannel(Channel.Both).OutputToFile("output.mp4").Arguments;
|
||||||
|
Assert.AreEqual("-i \"input.mp4\" \"output.mp4\"", str);
|
||||||
|
}
|
||||||
|
|
||||||
|
[TestMethod]
|
||||||
|
public void Builder_BuildString_AudioSamplingRate_Default()
|
||||||
|
{
|
||||||
|
var str = FFMpegArguments.FromInputFiles(true, "input.mp4").WithAudioSamplingRate().OutputToFile("output.mp4").Arguments;
|
||||||
|
Assert.AreEqual("-i \"input.mp4\" -ar 48000 \"output.mp4\"", str);
|
||||||
|
}
|
||||||
|
|
||||||
|
[TestMethod]
|
||||||
|
public void Builder_BuildString_AudioSamplingRate()
|
||||||
|
{
|
||||||
|
var str = FFMpegArguments.FromInputFiles(true, "input.mp4").WithAudioSamplingRate(44000).OutputToFile("output.mp4").Arguments;
|
||||||
|
Assert.AreEqual("-i \"input.mp4\" -ar 44000 \"output.mp4\"", str);
|
||||||
|
}
|
||||||
|
|
||||||
|
[TestMethod]
|
||||||
|
public void Builder_BuildString_VariableBitrate()
|
||||||
|
{
|
||||||
|
var str = FFMpegArguments.FromInputFiles(true, "input.mp4").WithVariableBitrate(5).OutputToFile("output.mp4").Arguments;
|
||||||
|
Assert.AreEqual("-i \"input.mp4\" -vbr 5 \"output.mp4\"", str);
|
||||||
|
}
|
||||||
|
|
||||||
|
[TestMethod]
|
||||||
|
public void Builder_BuildString_Faststart()
|
||||||
|
{
|
||||||
|
var str = FFMpegArguments.FromInputFiles(true, "input.mp4").WithFastStart().OutputToFile("output.mp4").Arguments;
|
||||||
|
Assert.AreEqual("-i \"input.mp4\" -movflags faststart \"output.mp4\"", str);
|
||||||
|
}
|
||||||
|
|
||||||
|
[TestMethod]
|
||||||
|
public void Builder_BuildString_Overwrite()
|
||||||
|
{
|
||||||
|
var str = FFMpegArguments.FromInputFiles(true, "input.mp4").OverwriteExisting().OutputToFile("output.mp4").Arguments;
|
||||||
|
Assert.AreEqual("-i \"input.mp4\" -y \"output.mp4\"", str);
|
||||||
|
}
|
||||||
|
|
||||||
|
[TestMethod]
|
||||||
|
public void Builder_BuildString_RemoveMetadata()
|
||||||
|
{
|
||||||
|
var str = FFMpegArguments.FromInputFiles(true, "input.mp4").WithoutMetadata().OutputToFile("output.mp4").Arguments;
|
||||||
|
Assert.AreEqual("-i \"input.mp4\" -map_metadata -1 \"output.mp4\"", str);
|
||||||
|
}
|
||||||
|
|
||||||
|
[TestMethod]
|
||||||
|
public void Builder_BuildString_Transpose()
|
||||||
|
{
|
||||||
|
var str = FFMpegArguments.FromInputFiles(true, "input.mp4").Transpose(Transposition.CounterClockwise90).OutputToFile("output.mp4").Arguments;
|
||||||
|
Assert.AreEqual("-i \"input.mp4\" -vf \"transpose=2\" \"output.mp4\"", str);
|
||||||
|
}
|
||||||
|
|
||||||
[TestMethod]
|
[TestMethod]
|
||||||
public void Builder_BuildString_CpuSpeed()
|
public void Builder_BuildString_CpuSpeed()
|
||||||
{
|
{
|
||||||
|
@ -171,6 +241,18 @@ public void Builder_BuildString_DrawtextFilter()
|
||||||
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);
|
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_DrawtextFilter_Alt()
|
||||||
|
{
|
||||||
|
var str = FFMpegArguments
|
||||||
|
.FromInputFiles(true, "input.mp4")
|
||||||
|
.DrawText(DrawTextOptions
|
||||||
|
.Create("Stack Overflow", "/path/to/font.ttf", ("fontcolor", "white"), ("fontsize", "24")))
|
||||||
|
.OutputToFile("output.mp4").Arguments;
|
||||||
|
|
||||||
|
Assert.AreEqual("-i \"input.mp4\" -vf drawtext=\"text='Stack Overflow':fontfile=/path/to/font.ttf:fontcolor=white:fontsize=24\" \"output.mp4\"", str);
|
||||||
|
}
|
||||||
|
|
||||||
[TestMethod]
|
[TestMethod]
|
||||||
public void Builder_BuildString_StartNumber()
|
public void Builder_BuildString_StartNumber()
|
||||||
{
|
{
|
||||||
|
|
|
@ -3,8 +3,6 @@
|
||||||
using FFMpegCore.Test.Resources;
|
using FFMpegCore.Test.Resources;
|
||||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using FFMpegCore.FFMPEG;
|
|
||||||
using FFMpegCore.FFMPEG.Argument;
|
|
||||||
|
|
||||||
namespace FFMpegCore.Test
|
namespace FFMpegCore.Test
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
using FFMpegCore.FFMPEG;
|
using FFMpegCore.Test.Resources;
|
||||||
using FFMpegCore.Test.Resources;
|
|
||||||
using System.IO;
|
using System.IO;
|
||||||
|
|
||||||
namespace FFMpegCore.Test
|
namespace FFMpegCore.Test
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
using FFMpegCore.Extend;
|
using FFMpegCore.Extend;
|
||||||
using FFMpegCore.FFMPEG.Pipes;
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
using System.Drawing.Imaging;
|
using System.Drawing.Imaging;
|
||||||
using System.Numerics;
|
using System.Numerics;
|
||||||
|
using FFMpegCore.Pipes;
|
||||||
|
|
||||||
namespace FFMpegCore.Test
|
namespace FFMpegCore.Test
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
using FFMpegCore.FFMPEG;
|
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using FFMpegCore.FFMPEG;
|
|
||||||
using FFMpegCore.Test.Resources;
|
using FFMpegCore.Test.Resources;
|
||||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||||
|
|
||||||
|
@ -20,6 +19,35 @@ public void Probe_Success()
|
||||||
{
|
{
|
||||||
var info = FFProbe.Analyse(VideoLibrary.LocalVideo.FullName);
|
var info = FFProbe.Analyse(VideoLibrary.LocalVideo.FullName);
|
||||||
Assert.AreEqual(13, info.Duration.Seconds);
|
Assert.AreEqual(13, info.Duration.Seconds);
|
||||||
|
Assert.AreEqual(".mp4", info.Extension);
|
||||||
|
Assert.AreEqual(VideoLibrary.LocalVideo.FullName, info.Path);
|
||||||
|
|
||||||
|
Assert.AreEqual("5.1", info.PrimaryAudioStream.ChannelLayout);
|
||||||
|
Assert.AreEqual(6, info.PrimaryAudioStream.Channels);
|
||||||
|
Assert.AreEqual("AAC (Advanced Audio Coding)", info.PrimaryAudioStream.CodecLongName);
|
||||||
|
Assert.AreEqual("aac", info.PrimaryAudioStream.CodecName);
|
||||||
|
Assert.AreEqual(381988, info.PrimaryAudioStream.BitRate);
|
||||||
|
Assert.AreEqual(48000, info.PrimaryAudioStream.SampleRateHz);
|
||||||
|
|
||||||
|
Assert.AreEqual(862991, info.PrimaryVideoStream.BitRate);
|
||||||
|
Assert.AreEqual(16, info.PrimaryVideoStream.DisplayAspectRatio.Width);
|
||||||
|
Assert.AreEqual(9, info.PrimaryVideoStream.DisplayAspectRatio.Height);
|
||||||
|
Assert.AreEqual("yuv420p", info.PrimaryVideoStream.PixelFormat);
|
||||||
|
Assert.AreEqual(1280, info.PrimaryVideoStream.Width);
|
||||||
|
Assert.AreEqual(720, info.PrimaryVideoStream.Height);
|
||||||
|
Assert.AreEqual(25, info.PrimaryVideoStream.AvgFrameRate);
|
||||||
|
Assert.AreEqual(25, info.PrimaryVideoStream.FrameRate);
|
||||||
|
Assert.AreEqual("H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10", info.PrimaryVideoStream.CodecLongName);
|
||||||
|
Assert.AreEqual("h264", info.PrimaryVideoStream.CodecName);
|
||||||
|
Assert.AreEqual(8, info.PrimaryVideoStream.BitsPerRawSample);
|
||||||
|
Assert.AreEqual("Main", info.PrimaryVideoStream.Profile);
|
||||||
|
}
|
||||||
|
|
||||||
|
[TestMethod]
|
||||||
|
public async Task Probe_Async_Success()
|
||||||
|
{
|
||||||
|
var info = await FFProbe.AnalyseAsync(VideoLibrary.LocalVideo.FullName);
|
||||||
|
Assert.AreEqual(13, info.Duration.Seconds);
|
||||||
}
|
}
|
||||||
|
|
||||||
[TestMethod]
|
[TestMethod]
|
||||||
|
|
|
@ -1,8 +1,4 @@
|
||||||
using FFMpegCore.Enums;
|
using FFMpegCore.Enums;
|
||||||
using FFMpegCore.FFMPEG.Argument;
|
|
||||||
using FFMpegCore.FFMPEG.Enums;
|
|
||||||
using FFMpegCore.FFMPEG.Exceptions;
|
|
||||||
using FFMpegCore.FFMPEG.Pipes;
|
|
||||||
using FFMpegCore.Test.Resources;
|
using FFMpegCore.Test.Resources;
|
||||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||||
using System;
|
using System;
|
||||||
|
@ -11,7 +7,9 @@
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using FFMpegCore.FFMPEG;
|
using FFMpegCore.Arguments;
|
||||||
|
using FFMpegCore.Exceptions;
|
||||||
|
using FFMpegCore.Pipes;
|
||||||
|
|
||||||
namespace FFMpegCore.Test
|
namespace FFMpegCore.Test
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,11 +1,10 @@
|
||||||
using System;
|
using System;
|
||||||
using FFMpegCore.FFMPEG.Enums;
|
|
||||||
|
|
||||||
namespace FFMpegCore.Enums
|
namespace FFMpegCore.Enums
|
||||||
{
|
{
|
||||||
public static class FileExtension
|
public static class FileExtension
|
||||||
{
|
{
|
||||||
public static string ForType(VideoType type)
|
public static string Extension(this VideoType type)
|
||||||
{
|
{
|
||||||
return type switch
|
return type switch
|
||||||
{
|
{
|
||||||
|
@ -16,7 +15,7 @@ public static string ForType(VideoType type)
|
||||||
_ => throw new Exception("The extension for this video type is not defined.")
|
_ => throw new Exception("The extension for this video type is not defined.")
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
public static string ForCodec(VideoCodec type)
|
public static string Extension(this VideoCodec type)
|
||||||
{
|
{
|
||||||
return type switch
|
return type switch
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using FFMpegCore.FFMPEG;
|
|
||||||
|
|
||||||
namespace FFMpegCore.Extend
|
namespace FFMpegCore.Extend
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,10 +1,9 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
using System.Drawing.Imaging;
|
using System.Drawing.Imaging;
|
||||||
using System.IO;
|
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using FFMpegCore.FFMPEG.Pipes;
|
using FFMpegCore.Pipes;
|
||||||
|
|
||||||
namespace FFMpegCore.Extend
|
namespace FFMpegCore.Extend
|
||||||
{
|
{
|
||||||
|
@ -24,7 +23,7 @@ public BitmapVideoFrameWrapper(Bitmap bitmap)
|
||||||
Format = ConvertStreamFormat(bitmap.PixelFormat);
|
Format = ConvertStreamFormat(bitmap.PixelFormat);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Serialize(Stream stream)
|
public void Serialize(System.IO.Stream stream)
|
||||||
{
|
{
|
||||||
var data = Source.LockBits(new Rectangle(0, 0, Width, Height), ImageLockMode.ReadOnly, Source.PixelFormat);
|
var data = Source.LockBits(new Rectangle(0, 0, Width, Height), ImageLockMode.ReadOnly, Source.PixelFormat);
|
||||||
|
|
||||||
|
@ -40,7 +39,7 @@ public void Serialize(Stream stream)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task SerializeAsync(Stream stream)
|
public async Task SerializeAsync(System.IO.Stream stream)
|
||||||
{
|
{
|
||||||
var data = Source.LockBits(new Rectangle(0, 0, Width, Height), ImageLockMode.ReadOnly, Source.PixelFormat);
|
var data = Source.LockBits(new Rectangle(0, 0, Width, Height), ImageLockMode.ReadOnly, Source.PixelFormat);
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
using System;
|
using System;
|
||||||
using FFMpegCore.FFMPEG;
|
|
||||||
|
|
||||||
namespace FFMpegCore.Extend
|
namespace FFMpegCore.Extend
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
using FFMpegCore.FFMPEG.Enums;
|
using FFMpegCore.Enums;
|
||||||
|
|
||||||
namespace FFMpegCore.FFMPEG.Argument
|
namespace FFMpegCore.Arguments
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Represents parameter of audio codec and it's quality
|
/// Represents parameter of audio codec and it's quality
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
using FFMpegCore.FFMPEG.Enums;
|
using FFMpegCore.Enums;
|
||||||
|
|
||||||
namespace FFMpegCore.FFMPEG.Argument
|
namespace FFMpegCore.Arguments
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Represents parameter of audio codec and it's quality
|
/// Represents parameter of audio codec and it's quality
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
namespace FFMpegCore.FFMPEG.Argument
|
namespace FFMpegCore.Arguments
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Audio sampling rate argument. Defaults to 48000 (Hz)
|
/// Audio sampling rate argument. Defaults to 48000 (Hz)
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
using FFMpegCore.FFMPEG.Enums;
|
using FFMpegCore.Enums;
|
||||||
|
|
||||||
namespace FFMpegCore.FFMPEG.Argument
|
namespace FFMpegCore.Arguments
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Represents parameter of bitstream filter
|
/// Represents parameter of bitstream filter
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
|
||||||
namespace FFMpegCore.FFMPEG.Argument
|
namespace FFMpegCore.Arguments
|
||||||
{
|
{
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
using System;
|
using System;
|
||||||
|
|
||||||
namespace FFMpegCore.FFMPEG.Argument
|
namespace FFMpegCore.Arguments
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Constant Rate Factor (CRF) argument
|
/// Constant Rate Factor (CRF) argument
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
using FFMpegCore.FFMPEG.Enums;
|
using FFMpegCore.Enums;
|
||||||
|
|
||||||
namespace FFMpegCore.FFMPEG.Argument
|
namespace FFMpegCore.Arguments
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Represents parameter of copy parameter
|
/// Represents parameter of copy parameter
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
namespace FFMpegCore.FFMPEG.Argument
|
namespace FFMpegCore.Arguments
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Represents cpu speed parameter
|
/// Represents cpu speed parameter
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
namespace FFMpegCore.FFMPEG.Argument
|
namespace FFMpegCore.Arguments
|
||||||
{
|
{
|
||||||
public class CustomArgument : IArgument
|
public class CustomArgument : IArgument
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
using FFMpegCore.FFMPEG.Enums;
|
using FFMpegCore.Enums;
|
||||||
using FFMpegCore.FFMPEG.Exceptions;
|
using FFMpegCore.Exceptions;
|
||||||
|
|
||||||
namespace FFMpegCore.FFMPEG.Argument
|
namespace FFMpegCore.Arguments
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Represents cpu speed parameter
|
/// Represents cpu speed parameter
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
|
||||||
namespace FFMpegCore.FFMPEG.Argument
|
namespace FFMpegCore.Arguments
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Drawtext video filter argument
|
/// Drawtext video filter argument
|
||||||
|
@ -10,9 +10,6 @@ public class DrawTextArgument : IArgument
|
||||||
{
|
{
|
||||||
public readonly DrawTextOptions Options;
|
public readonly DrawTextOptions Options;
|
||||||
|
|
||||||
public DrawTextArgument(string text, string fontPath, params (string, string)[] optionalArguments)
|
|
||||||
: this(DrawTextOptions.Create(text, fontPath, optionalArguments)) { }
|
|
||||||
|
|
||||||
public DrawTextArgument(DrawTextOptions options)
|
public DrawTextArgument(DrawTextOptions options)
|
||||||
{
|
{
|
||||||
Options = options;
|
Options = options;
|
||||||
|
@ -31,7 +28,7 @@ public static DrawTextOptions Create(string text, string font)
|
||||||
{
|
{
|
||||||
return new DrawTextOptions(text, font, new List<(string, string)>());
|
return new DrawTextOptions(text, font, new List<(string, string)>());
|
||||||
}
|
}
|
||||||
public static DrawTextOptions Create(string text, string font, IEnumerable<(string key, string value)> parameters)
|
public static DrawTextOptions Create(string text, string font, params (string key, string value)[] parameters)
|
||||||
{
|
{
|
||||||
return new DrawTextOptions(text, font, parameters);
|
return new DrawTextOptions(text, font, parameters);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
using System;
|
using System;
|
||||||
|
|
||||||
namespace FFMpegCore.FFMPEG.Argument
|
namespace FFMpegCore.Arguments
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Represents duration parameter
|
/// Represents duration parameter
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
namespace FFMpegCore.FFMPEG.Argument
|
namespace FFMpegCore.Arguments
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Faststart argument - for moving moov atom to the start of file
|
/// Faststart argument - for moving moov atom to the start of file
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
using FFMpegCore.FFMPEG.Enums;
|
using FFMpegCore.Enums;
|
||||||
|
|
||||||
namespace FFMpegCore.FFMPEG.Argument
|
namespace FFMpegCore.Arguments
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Represents force format parameter
|
/// Represents force format parameter
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
namespace FFMpegCore.FFMPEG.Argument
|
namespace FFMpegCore.Arguments
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Represents frame output count parameter
|
/// Represents frame output count parameter
|
||||||
|
@ -6,8 +6,6 @@
|
||||||
public class FrameOutputCountArgument : IArgument
|
public class FrameOutputCountArgument : IArgument
|
||||||
{
|
{
|
||||||
public readonly int Frames;
|
public readonly int Frames;
|
||||||
public FrameOutputCountArgument() { }
|
|
||||||
|
|
||||||
public FrameOutputCountArgument(int frames)
|
public FrameOutputCountArgument(int frames)
|
||||||
{
|
{
|
||||||
Frames = frames;
|
Frames = frames;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
namespace FFMpegCore.FFMPEG.Argument
|
namespace FFMpegCore.Arguments
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Represents frame rate parameter
|
/// Represents frame rate parameter
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace FFMpegCore.FFMPEG.Argument
|
namespace FFMpegCore.Arguments
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Represents input parameter
|
/// Represents input parameter
|
||||||
|
@ -41,19 +41,23 @@ public void Pre()
|
||||||
|
|
||||||
public interface IArgument
|
public interface IArgument
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The textual representation of the argument
|
||||||
|
/// </summary>
|
||||||
string Text { get; }
|
string Text { get; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public interface IInputArgument : IArgument
|
public interface IInputOutputArgument : IArgument
|
||||||
{
|
{
|
||||||
void Pre() {}
|
void Pre() {}
|
||||||
Task During(CancellationToken? cancellationToken = null) => Task.CompletedTask;
|
Task During(CancellationToken? cancellationToken = null) => Task.CompletedTask;
|
||||||
void Post() {}
|
void Post() {}
|
||||||
}
|
}
|
||||||
public interface IOutputArgument : IArgument
|
|
||||||
|
public interface IInputArgument : IInputOutputArgument
|
||||||
|
{
|
||||||
|
}
|
||||||
|
public interface IOutputArgument : IInputOutputArgument
|
||||||
{
|
{
|
||||||
void Pre() {}
|
|
||||||
Task During(CancellationToken? cancellationToken = null) => Task.CompletedTask;
|
|
||||||
void Post() {}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
using System.IO.Pipes;
|
using System.IO.Pipes;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using FFMpegCore.FFMPEG.Pipes;
|
using FFMpegCore.Pipes;
|
||||||
|
|
||||||
namespace FFMpegCore.FFMPEG.Argument
|
namespace FFMpegCore.Arguments
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Represents input parameter for a named pipe
|
/// Represents input parameter for a named pipe
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
namespace FFMpegCore.FFMPEG.Argument
|
namespace FFMpegCore.Arguments
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Represents loop parameter
|
/// Represents loop parameter
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
using System;
|
using System;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using FFMpegCore.FFMPEG.Exceptions;
|
using FFMpegCore.Exceptions;
|
||||||
|
|
||||||
namespace FFMpegCore.FFMPEG.Argument
|
namespace FFMpegCore.Arguments
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Represents output parameter
|
/// Represents output parameter
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
using System.IO.Pipes;
|
using System.IO.Pipes;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using FFMpegCore.FFMPEG.Pipes;
|
using FFMpegCore.Pipes;
|
||||||
|
|
||||||
namespace FFMpegCore.FFMPEG.Argument
|
namespace FFMpegCore.Arguments
|
||||||
{
|
{
|
||||||
public class OutputPipeArgument : PipeArgument
|
public class OutputPipeArgument : PipeArgument
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
namespace FFMpegCore.FFMPEG.Argument
|
namespace FFMpegCore.Arguments
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Represents overwrite parameter
|
/// Represents overwrite parameter
|
||||||
|
|
|
@ -2,9 +2,9 @@
|
||||||
using System.IO.Pipes;
|
using System.IO.Pipes;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using FFMpegCore.FFMPEG.Pipes;
|
using FFMpegCore.Pipes;
|
||||||
|
|
||||||
namespace FFMpegCore.FFMPEG.Argument
|
namespace FFMpegCore.Arguments
|
||||||
{
|
{
|
||||||
public abstract class PipeArgument : IInputArgument, IOutputArgument
|
public abstract class PipeArgument : IInputArgument, IOutputArgument
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
namespace FFMpegCore.FFMPEG.Argument
|
namespace FFMpegCore.Arguments
|
||||||
{
|
{
|
||||||
public class QuietArgument : IArgument
|
public class QuietArgument : IArgument
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
namespace FFMpegCore.FFMPEG.Argument
|
namespace FFMpegCore.Arguments
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Remove metadata argument
|
/// Remove metadata argument
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
using FFMpegCore.FFMPEG.Enums;
|
using FFMpegCore.Enums;
|
||||||
|
|
||||||
namespace FFMpegCore.FFMPEG.Argument
|
namespace FFMpegCore.Arguments
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Represents scale parameter
|
/// Represents scale parameter
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
using System;
|
using System;
|
||||||
|
|
||||||
namespace FFMpegCore.FFMPEG.Argument
|
namespace FFMpegCore.Arguments
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Represents seek parameter
|
/// Represents seek parameter
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
namespace FFMpegCore.FFMPEG.Argument
|
namespace FFMpegCore.Arguments
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Represents shortest parameter
|
/// Represents shortest parameter
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
using FFMpegCore.FFMPEG.Enums;
|
using FFMpegCore.Enums;
|
||||||
|
|
||||||
namespace FFMpegCore.FFMPEG.Argument
|
namespace FFMpegCore.Arguments
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Represents size parameter
|
/// Represents size parameter
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
using FFMpegCore.FFMPEG.Enums;
|
using FFMpegCore.Enums;
|
||||||
|
|
||||||
namespace FFMpegCore.FFMPEG.Argument
|
namespace FFMpegCore.Arguments
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Represents speed parameter
|
/// Represents speed parameter
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
namespace FFMpegCore.FFMPEG.Argument
|
namespace FFMpegCore.Arguments
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Represents start number parameter
|
/// Represents start number parameter
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
using System;
|
using System;
|
||||||
|
|
||||||
namespace FFMpegCore.FFMPEG.Argument
|
namespace FFMpegCore.Arguments
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Represents threads parameter
|
/// Represents threads parameter
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
using FFMpegCore.FFMPEG.Enums;
|
using FFMpegCore.Enums;
|
||||||
|
|
||||||
namespace FFMpegCore.FFMPEG.Argument
|
namespace FFMpegCore.Arguments
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Transpose argument.
|
/// Transpose argument.
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
using System;
|
using System;
|
||||||
|
|
||||||
namespace FFMpegCore.FFMPEG.Argument
|
namespace FFMpegCore.Arguments
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Variable Bitrate Argument (VBR) argument
|
/// Variable Bitrate Argument (VBR) argument
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
namespace FFMpegCore.FFMPEG.Argument
|
namespace FFMpegCore.Arguments
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Represents video bitrate parameter
|
/// Represents video bitrate parameter
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
using FFMpegCore.FFMPEG.Enums;
|
using FFMpegCore.Enums;
|
||||||
|
|
||||||
namespace FFMpegCore.FFMPEG.Argument
|
namespace FFMpegCore.Arguments
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Represents video codec parameter
|
/// Represents video codec parameter
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
namespace FFMpegCore.FFMPEG.Enums
|
namespace FFMpegCore.Enums
|
||||||
{
|
{
|
||||||
public enum AudioQuality
|
public enum AudioQuality
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
namespace FFMpegCore.FFMPEG.Enums
|
namespace FFMpegCore.Enums
|
||||||
{
|
{
|
||||||
public enum VideoCodec
|
public enum VideoCodec
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
namespace FFMpegCore.FFMPEG.Enums
|
namespace FFMpegCore.Enums
|
||||||
{
|
{
|
||||||
public enum Speed
|
public enum Speed
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
namespace FFMpegCore.FFMPEG.Enums
|
namespace FFMpegCore.Enums
|
||||||
{
|
{
|
||||||
public enum Transposition
|
public enum Transposition
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
namespace FFMpegCore.FFMPEG.Enums
|
namespace FFMpegCore.Enums
|
||||||
{
|
{
|
||||||
public enum VideoSize
|
public enum VideoSize
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
using System;
|
using System;
|
||||||
|
|
||||||
namespace FFMpegCore.FFMPEG.Exceptions
|
namespace FFMpegCore.Exceptions
|
||||||
{
|
{
|
||||||
public enum FFMpegExceptionType
|
public enum FFMpegExceptionType
|
||||||
{
|
{
|
||||||
|
|
|
@ -5,11 +5,9 @@
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using FFMpegCore.Enums;
|
using FFMpegCore.Enums;
|
||||||
using FFMpegCore.FFMPEG.Argument;
|
|
||||||
using FFMpegCore.FFMPEG.Enums;
|
|
||||||
using FFMpegCore.Helpers;
|
using FFMpegCore.Helpers;
|
||||||
|
|
||||||
namespace FFMpegCore.FFMPEG
|
namespace FFMpegCore
|
||||||
{
|
{
|
||||||
public static class FFMpeg
|
public static class FFMpeg
|
||||||
{
|
{
|
||||||
|
@ -98,7 +96,7 @@ public static bool Convert(
|
||||||
AudioQuality audioQuality = AudioQuality.Normal,
|
AudioQuality audioQuality = AudioQuality.Normal,
|
||||||
bool multithreaded = false)
|
bool multithreaded = false)
|
||||||
{
|
{
|
||||||
FFMpegHelper.ExtensionExceptionCheck(output, FileExtension.ForType(type));
|
FFMpegHelper.ExtensionExceptionCheck(output, type.Extension());
|
||||||
FFMpegHelper.ConversionSizeExceptionCheck(source);
|
FFMpegHelper.ConversionSizeExceptionCheck(source);
|
||||||
|
|
||||||
var scale = VideoSize.Original == size ? 1 : (double)source.PrimaryVideoStream.Height / (int)size;
|
var scale = VideoSize.Original == size ? 1 : (double)source.PrimaryVideoStream.Height / (int)size;
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
using FFMpegCore.Helpers;
|
using FFMpegCore.Helpers;
|
||||||
using Instances;
|
using Instances;
|
||||||
|
|
||||||
namespace FFMpegCore.FFMPEG.Argument
|
namespace FFMpegCore
|
||||||
{
|
{
|
||||||
public class FFMpegArgumentProcessor
|
public class FFMpegArgumentProcessor
|
||||||
{
|
{
|
||||||
|
|
|
@ -5,10 +5,11 @@
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using FFMpegCore.FFMPEG.Enums;
|
using FFMpegCore.Arguments;
|
||||||
using FFMpegCore.FFMPEG.Pipes;
|
using FFMpegCore.Enums;
|
||||||
|
using FFMpegCore.Pipes;
|
||||||
|
|
||||||
namespace FFMpegCore.FFMPEG.Argument
|
namespace FFMpegCore
|
||||||
{
|
{
|
||||||
public class FFMpegArguments
|
public class FFMpegArguments
|
||||||
{
|
{
|
||||||
|
@ -71,7 +72,7 @@ private FFMpegArguments(IInputArgument inputArgument)
|
||||||
public FFMpegArguments WithCustomArgument(string argument) => WithArgument(new CustomArgument(argument));
|
public FFMpegArguments WithCustomArgument(string argument) => WithArgument(new CustomArgument(argument));
|
||||||
|
|
||||||
public FFMpegArguments Seek(TimeSpan? seekTo) => WithArgument(new SeekArgument(seekTo));
|
public FFMpegArguments Seek(TimeSpan? seekTo) => WithArgument(new SeekArgument(seekTo));
|
||||||
public FFMpegArguments Transpose(TimeSpan? seekTo) => WithArgument(new SeekArgument(seekTo));
|
public FFMpegArguments Transpose(Transposition transposition) => WithArgument(new TransposeArgument(transposition));
|
||||||
public FFMpegArguments Loop(int times) => WithArgument(new LoopArgument(times));
|
public FFMpegArguments Loop(int times) => WithArgument(new LoopArgument(times));
|
||||||
public FFMpegArguments OverwriteExisting() => WithArgument(new OverwriteArgument());
|
public FFMpegArguments OverwriteExisting() => WithArgument(new OverwriteArgument());
|
||||||
public FFMpegArguments Quiet() => WithArgument(new QuietArgument());
|
public FFMpegArguments Quiet() => WithArgument(new QuietArgument());
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
using System.Text.Json;
|
using System.Text.Json;
|
||||||
|
|
||||||
namespace FFMpegCore.FFMPEG
|
namespace FFMpegCore
|
||||||
{
|
{
|
||||||
public class FFMpegOptions
|
public class FFMpegOptions
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace FFMpegCore.FFMPEG.Pipes
|
namespace FFMpegCore.Pipes
|
||||||
{
|
{
|
||||||
public interface IPipeDataReader
|
public interface IPipeDataReader
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace FFMpegCore.FFMPEG.Pipes
|
namespace FFMpegCore.Pipes
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Interface for ffmpeg pipe source data IO
|
/// Interface for ffmpeg pipe source data IO
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace FFMpegCore.FFMPEG.Pipes
|
namespace FFMpegCore.Pipes
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Interface for Video frame
|
/// Interface for Video frame
|
||||||
|
|
|
@ -1,14 +1,18 @@
|
||||||
using System;
|
using System;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
namespace FFMpegCore.FFMPEG.Pipes
|
namespace FFMpegCore.Pipes
|
||||||
{
|
{
|
||||||
static class PipeHelpers
|
static class PipeHelpers
|
||||||
{
|
{
|
||||||
public static string GetUnqiuePipeName() => "FFMpegCore_Pipe_" + Guid.NewGuid();
|
public static string GetUnqiuePipeName() => "FFMpegCore_" + Guid.NewGuid();
|
||||||
|
|
||||||
public static string GetPipePath(string pipeName)
|
public static string GetPipePath(string pipeName)
|
||||||
{
|
{
|
||||||
return $@"\\.\pipe\{pipeName}";
|
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
|
||||||
|
return $@"\\.\pipe\{pipeName}";
|
||||||
|
else
|
||||||
|
return $"unix:/tmp/CoreFxPipe_{pipeName}"; // dotnet uses unix sockets on unix, for more see https://github.com/dotnet/runtime/issues/24390
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using FFMpegCore.FFMPEG.Exceptions;
|
using FFMpegCore.Exceptions;
|
||||||
|
|
||||||
namespace FFMpegCore.FFMPEG.Pipes
|
namespace FFMpegCore.Pipes
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Implementation of <see cref="IPipeDataWriter"/> for a raw video stream that is gathered from <see cref="IEnumerator{IVideoFrame}"/>
|
/// Implementation of <see cref="IPipeDataWriter"/> for a raw video stream that is gathered from <see cref="IEnumerator{IVideoFrame}"/>
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace FFMpegCore.FFMPEG.Pipes
|
namespace FFMpegCore.Pipes
|
||||||
{
|
{
|
||||||
public class StreamPipeDataReader : IPipeDataReader
|
public class StreamPipeDataReader : IPipeDataReader
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace FFMpegCore.FFMPEG.Pipes
|
namespace FFMpegCore.Pipes
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Implementation of <see cref="IPipeDataWriter"/> used for stream redirection
|
/// Implementation of <see cref="IPipeDataWriter"/> used for stream redirection
|
||||||
|
|
3
FFMpegCore/FFMpegCore.csproj.DotSettings
Normal file
3
FFMpegCore/FFMpegCore.csproj.DotSettings
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
|
||||||
|
<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=ffmpeg/@EntryIndexedValue">True</s:Boolean>
|
||||||
|
<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=ffprobe/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>
|
|
@ -1,4 +1,4 @@
|
||||||
namespace FFMpegCore.FFMPEG
|
namespace FFMpegCore
|
||||||
{
|
{
|
||||||
public class AudioStream : MediaStream
|
public class AudioStream : MediaStream
|
||||||
{
|
{
|
||||||
|
|
|
@ -2,13 +2,13 @@
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Text.Json;
|
using System.Text.Json;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using FFMpegCore.FFMPEG.Argument;
|
using FFMpegCore.Arguments;
|
||||||
using FFMpegCore.FFMPEG.Exceptions;
|
using FFMpegCore.Exceptions;
|
||||||
using FFMpegCore.FFMPEG.Pipes;
|
|
||||||
using FFMpegCore.Helpers;
|
using FFMpegCore.Helpers;
|
||||||
|
using FFMpegCore.Pipes;
|
||||||
using Instances;
|
using Instances;
|
||||||
|
|
||||||
namespace FFMpegCore.FFMPEG
|
namespace FFMpegCore
|
||||||
{
|
{
|
||||||
public static class FFProbe
|
public static class FFProbe
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Text.Json.Serialization;
|
using System.Text.Json.Serialization;
|
||||||
|
|
||||||
namespace FFMpegCore.FFMPEG
|
namespace FFMpegCore
|
||||||
{
|
{
|
||||||
public class FFProbeAnalysis
|
public class FFProbeAnalysis
|
||||||
{
|
{
|
||||||
|
@ -38,9 +38,6 @@ public class Stream
|
||||||
[JsonPropertyName("codec_long_name")]
|
[JsonPropertyName("codec_long_name")]
|
||||||
public string CodecLongName { get; set; } = null!;
|
public string CodecLongName { get; set; } = null!;
|
||||||
|
|
||||||
[JsonPropertyName("codec_tag_string")]
|
|
||||||
public string CodecTagString { get; set; } = null!;
|
|
||||||
|
|
||||||
[JsonPropertyName("display_aspect_ratio")]
|
[JsonPropertyName("display_aspect_ratio")]
|
||||||
public string DisplayAspectRatio { get; set; } = null!;
|
public string DisplayAspectRatio { get; set; } = null!;
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
|
||||||
namespace FFMpegCore.FFMPEG
|
namespace FFMpegCore
|
||||||
{
|
{
|
||||||
public class MediaAnalysis
|
public class MediaAnalysis
|
||||||
{
|
{
|
||||||
|
@ -41,7 +41,7 @@ private VideoStream ParseVideoStream(Stream stream)
|
||||||
CodecLongName = stream.CodecLongName,
|
CodecLongName = stream.CodecLongName,
|
||||||
DisplayAspectRatio = ParseRatioInt(stream.DisplayAspectRatio, ':'),
|
DisplayAspectRatio = ParseRatioInt(stream.DisplayAspectRatio, ':'),
|
||||||
Duration = ParseDuration(stream),
|
Duration = ParseDuration(stream),
|
||||||
FrameRate = DivideRatio(ParseRatioDouble(stream.AvgFrameRate, '/')),
|
FrameRate = DivideRatio(ParseRatioDouble(stream.FrameRate, '/')),
|
||||||
Height = stream.Height!.Value,
|
Height = stream.Height!.Value,
|
||||||
Width = stream.Width!.Value,
|
Width = stream.Width!.Value,
|
||||||
Profile = stream.Profile,
|
Profile = stream.Profile,
|
||||||
|
@ -74,15 +74,15 @@ private AudioStream ParseAudioStream(Stream stream)
|
||||||
private static double DivideRatio((double, double) ratio) => ratio.Item1 / ratio.Item2;
|
private static double DivideRatio((double, double) ratio) => ratio.Item1 / ratio.Item2;
|
||||||
private static (int, int) ParseRatioInt(string input, char separator)
|
private static (int, int) ParseRatioInt(string input, char separator)
|
||||||
{
|
{
|
||||||
if (string.IsNullOrEmpty(input)) return (default, default);
|
if (string.IsNullOrEmpty(input)) return (0, 0);
|
||||||
var ratio = input.Split(separator);
|
var ratio = input.Split(separator);
|
||||||
return (int.Parse(ratio[0]), int.Parse(ratio[1]));
|
return (int.Parse(ratio[0]), int.Parse(ratio[1]));
|
||||||
}
|
}
|
||||||
private static (double, double) ParseRatioDouble(string input, char separator)
|
private static (double, double) ParseRatioDouble(string input, char separator)
|
||||||
{
|
{
|
||||||
if (string.IsNullOrEmpty(input)) return (default, default);
|
if (string.IsNullOrEmpty(input)) return (0, 0);
|
||||||
var ratio = input.Split(separator);
|
var ratio = input.Split(separator);
|
||||||
return (ratio.Length > 0 ? int.Parse(ratio[0]) : default, ratio.Length > 1 ? int.Parse(ratio[1]) : default);
|
return (ratio.Length > 0 ? double.Parse(ratio[0]) : 0, ratio.Length > 1 ? double.Parse(ratio[1]) : 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,6 +1,6 @@
|
||||||
using System;
|
using System;
|
||||||
|
|
||||||
namespace FFMpegCore.FFMPEG
|
namespace FFMpegCore
|
||||||
{
|
{
|
||||||
public class MediaStream
|
public class MediaStream
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
namespace FFMpegCore.FFMPEG
|
namespace FFMpegCore
|
||||||
{
|
{
|
||||||
public class VideoStream : MediaStream
|
public class VideoStream : MediaStream
|
||||||
{
|
{
|
||||||
public double AvgFrameRate { get; internal set; }
|
public double AvgFrameRate { get; internal set; }
|
||||||
public int BitsPerRawSample { get; internal set; }
|
public int BitsPerRawSample { get; internal set; }
|
||||||
public (int width, int height) DisplayAspectRatio { get; internal set; }
|
public (int Width, int Height) DisplayAspectRatio { get; internal set; }
|
||||||
public string Profile { get; internal set; } = null!;
|
public string Profile { get; internal set; } = null!;
|
||||||
public int Width { get; internal set; }
|
public int Width { get; internal set; }
|
||||||
public int Height { get; internal set; }
|
public int Height { get; internal set; }
|
||||||
|
|
|
@ -1,8 +1,7 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using FFMpegCore.FFMPEG;
|
using FFMpegCore.Exceptions;
|
||||||
using FFMpegCore.FFMPEG.Exceptions;
|
|
||||||
|
|
||||||
namespace FFMpegCore.Helpers
|
namespace FFMpegCore.Helpers
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
using FFMpegCore.FFMPEG.Exceptions;
|
using FFMpegCore.Exceptions;
|
||||||
|
|
||||||
namespace FFMpegCore.Helpers
|
namespace FFMpegCore.Helpers
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue