浏览代码

fix: only use keyframes when remuxing video

cvium 3 年之前
父节点
当前提交
c07c7b753c

+ 2 - 1
Jellyfin.Api/Controllers/DynamicHlsController.cs

@@ -1414,7 +1414,8 @@ namespace Jellyfin.Api.Controllers
                 state.RunTimeTicks ?? 0,
                 state.Request.SegmentContainer ?? string.Empty,
                 "hls1/main/",
-                Request.QueryString.ToString());
+                Request.QueryString.ToString(),
+                EncodingHelper.IsCopyCodec(state.OutputVideoCodec));
             var playlist = _dynamicHlsPlaylistGenerator.CreateMainPlaylist(request);
 
             return new FileContentResult(Encoding.UTF8.GetBytes(playlist), MimeTypes.GetMimeType("playlist.m3u8"));

+ 8 - 1
src/Jellyfin.MediaEncoding.Hls/Playlist/CreateMainPlaylistRequest.cs

@@ -14,7 +14,8 @@ public class CreateMainPlaylistRequest
     /// <param name="segmentContainer">The desired segment container eg. "ts".</param>
     /// <param name="endpointPrefix">The URI prefix for the relative URL in the playlist.</param>
     /// <param name="queryString">The desired query string to append (must start with ?).</param>
-    public CreateMainPlaylistRequest(string filePath, int desiredSegmentLengthMs, long totalRuntimeTicks, string segmentContainer, string endpointPrefix, string queryString)
+    /// <param name="isRemuxingVideo">Whether the video is being remuxed.</param>
+    public CreateMainPlaylistRequest(string filePath, int desiredSegmentLengthMs, long totalRuntimeTicks, string segmentContainer, string endpointPrefix, string queryString, bool isRemuxingVideo)
     {
         FilePath = filePath;
         DesiredSegmentLengthMs = desiredSegmentLengthMs;
@@ -22,6 +23,7 @@ public class CreateMainPlaylistRequest
         SegmentContainer = segmentContainer;
         EndpointPrefix = endpointPrefix;
         QueryString = queryString;
+        IsRemuxingVideo = isRemuxingVideo;
     }
 
     /// <summary>
@@ -53,4 +55,9 @@ public class CreateMainPlaylistRequest
     /// Gets the query string.
     /// </summary>
     public string QueryString { get; }
+
+    /// <summary>
+    /// Gets a value indicating whether the video is being remuxed.
+    /// </summary>
+    public bool IsRemuxingVideo { get; }
 }

+ 2 - 1
src/Jellyfin.MediaEncoding.Hls/Playlist/DynamicHlsPlaylistGenerator.cs

@@ -34,7 +34,8 @@ public class DynamicHlsPlaylistGenerator : IDynamicHlsPlaylistGenerator
     public string CreateMainPlaylist(CreateMainPlaylistRequest request)
     {
         IReadOnlyList<double> segments;
-        if (TryExtractKeyframes(request.FilePath, out var keyframeData))
+        // For video transcodes it is sufficient with equal length segments as ffmpeg will create new keyframes
+        if (request.IsRemuxingVideo && TryExtractKeyframes(request.FilePath, out var keyframeData))
         {
             segments = ComputeSegments(keyframeData, request.DesiredSegmentLengthMs);
         }