diff options
| author | cvium <clausvium@gmail.com> | 2021-09-23 15:29:12 +0200 |
|---|---|---|
| committer | cvium <clausvium@gmail.com> | 2021-09-23 15:29:12 +0200 |
| commit | 9c15f96e12a0d48a70cbca8380bf78a4f2512b03 (patch) | |
| tree | 068bc87052c9554afa788bcafd6022e7545f8189 /src/Jellyfin.MediaEncoding.Keyframes/KeyframeExtractor.cs | |
| parent | 1ebd3c9ac33ab99813307728ad6efbf53a667d4e (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.cs | 56 |
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); + } + } +} |
