KeyframeExtractor.cs 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. using System;
  2. using System.IO;
  3. using Jellyfin.MediaEncoding.Keyframes.FfProbe;
  4. using Jellyfin.MediaEncoding.Keyframes.FfTool;
  5. using Jellyfin.MediaEncoding.Keyframes.Matroska;
  6. using Microsoft.Extensions.Logging;
  7. namespace Jellyfin.MediaEncoding.Keyframes
  8. {
  9. /// <summary>
  10. /// Manager class for the set of keyframe extractors.
  11. /// </summary>
  12. public class KeyframeExtractor
  13. {
  14. private readonly ILogger<KeyframeExtractor> _logger;
  15. /// <summary>
  16. /// Initializes a new instance of the <see cref="KeyframeExtractor"/> class.
  17. /// </summary>
  18. /// <param name="logger">An instance of the <see cref="ILogger{KeyframeExtractor}"/> interface.</param>
  19. public KeyframeExtractor(ILogger<KeyframeExtractor> logger)
  20. {
  21. _logger = logger;
  22. }
  23. /// <summary>
  24. /// Extracts the keyframe positions from a video file.
  25. /// </summary>
  26. /// <param name="filePath">Absolute file path to the media file.</param>
  27. /// <param name="ffProbePath">Absolute file path to the ffprobe executable.</param>
  28. /// <param name="ffToolPath">Absolute file path to the fftool executable.</param>
  29. /// <returns></returns>
  30. public KeyframeData GetKeyframeData(string filePath, string ffProbePath, string ffToolPath)
  31. {
  32. var extension = Path.GetExtension(filePath);
  33. if (string.Equals(extension, ".mkv", StringComparison.OrdinalIgnoreCase))
  34. {
  35. try
  36. {
  37. return MatroskaKeyframeExtractor.GetKeyframeData(filePath);
  38. }
  39. catch (InvalidOperationException ex)
  40. {
  41. _logger.LogError(ex, "{MatroskaKeyframeExtractor} failed to extract keyframes", nameof(MatroskaKeyframeExtractor));
  42. }
  43. }
  44. if (!string.IsNullOrEmpty(ffToolPath))
  45. {
  46. return FfToolKeyframeExtractor.GetKeyframeData(ffToolPath, filePath);
  47. }
  48. return FfProbeKeyframeExtractor.GetKeyframeData(ffProbePath, filePath);
  49. }
  50. }
  51. }