aboutsummaryrefslogtreecommitdiff
path: root/src/Jellyfin.MediaEncoding.Keyframes/KeyframeExtractor.cs
diff options
context:
space:
mode:
authorcvium <clausvium@gmail.com>2021-09-23 15:29:12 +0200
committercvium <clausvium@gmail.com>2021-09-23 15:29:12 +0200
commit9c15f96e12a0d48a70cbca8380bf78a4f2512b03 (patch)
tree068bc87052c9554afa788bcafd6022e7545f8189 /src/Jellyfin.MediaEncoding.Keyframes/KeyframeExtractor.cs
parent1ebd3c9ac33ab99813307728ad6efbf53a667d4e (diff)
Add first draft of keyframe extraction for Matroska
Diffstat (limited to 'src/Jellyfin.MediaEncoding.Keyframes/KeyframeExtractor.cs')
-rw-r--r--src/Jellyfin.MediaEncoding.Keyframes/KeyframeExtractor.cs56
1 files changed, 56 insertions, 0 deletions
diff --git a/src/Jellyfin.MediaEncoding.Keyframes/KeyframeExtractor.cs b/src/Jellyfin.MediaEncoding.Keyframes/KeyframeExtractor.cs
new file mode 100644
index 000000000..2ee6b43e6
--- /dev/null
+++ b/src/Jellyfin.MediaEncoding.Keyframes/KeyframeExtractor.cs
@@ -0,0 +1,56 @@
+using System;
+using System.IO;
+using Jellyfin.MediaEncoding.Keyframes.FfProbe;
+using Jellyfin.MediaEncoding.Keyframes.FfTool;
+using Jellyfin.MediaEncoding.Keyframes.Matroska;
+using Microsoft.Extensions.Logging;
+
+namespace Jellyfin.MediaEncoding.Keyframes
+{
+ /// <summary>
+ /// Manager class for the set of keyframe extractors.
+ /// </summary>
+ public class KeyframeExtractor
+ {
+ private readonly ILogger<KeyframeExtractor> _logger;
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="KeyframeExtractor"/> class.
+ /// </summary>
+ /// <param name="logger">An instance of the <see cref="ILogger{KeyframeExtractor}"/> interface.</param>
+ public KeyframeExtractor(ILogger<KeyframeExtractor> logger)
+ {
+ _logger = logger;
+ }
+
+ /// <summary>
+ /// Extracts the keyframe positions from a video file.
+ /// </summary>
+ /// <param name="filePath">Absolute file path to the media file.</param>
+ /// <param name="ffProbePath">Absolute file path to the ffprobe executable.</param>
+ /// <param name="ffToolPath">Absolute file path to the fftool executable.</param>
+ /// <returns></returns>
+ public KeyframeData GetKeyframeData(string filePath, string ffProbePath, string ffToolPath)
+ {
+ var extension = Path.GetExtension(filePath);
+ if (string.Equals(extension, ".mkv", StringComparison.OrdinalIgnoreCase))
+ {
+ try
+ {
+ return MatroskaKeyframeExtractor.GetKeyframeData(filePath);
+ }
+ catch (InvalidOperationException ex)
+ {
+ _logger.LogError(ex, "{MatroskaKeyframeExtractor} failed to extract keyframes", nameof(MatroskaKeyframeExtractor));
+ }
+ }
+
+ if (!string.IsNullOrEmpty(ffToolPath))
+ {
+ return FfToolKeyframeExtractor.GetKeyframeData(ffToolPath, filePath);
+ }
+
+ return FfProbeKeyframeExtractor.GetKeyframeData(ffProbePath, filePath);
+ }
+ }
+}