浏览代码

Set input readrate for using SegmentDeletion with stream-copy

Signed-off-by: nyanmisaka <nst799610810@gmail.com>
nyanmisaka 1 年之前
父节点
当前提交
39b953e41c
共有 1 个文件被更改,包括 13 次插入1 次删除
  1. 13 1
      MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs

+ 13 - 1
MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs

@@ -51,6 +51,8 @@ namespace MediaBrowser.Controller.MediaEncoding
         private readonly Version _minFFmpegOclCuTonemapMode = new Version(5, 1, 3);
         private readonly Version _minFFmpegOclCuTonemapMode = new Version(5, 1, 3);
         private readonly Version _minFFmpegSvtAv1Params = new Version(5, 1);
         private readonly Version _minFFmpegSvtAv1Params = new Version(5, 1);
         private readonly Version _minFFmpegVaapiH26xEncA53CcSei = new Version(6, 0);
         private readonly Version _minFFmpegVaapiH26xEncA53CcSei = new Version(6, 0);
+        private readonly Version _minFFmpegAutoscaleOption = new Version(4, 4);
+        private readonly Version _minFFmpegReadrateOption = new Version(5, 0);
 
 
         private static readonly string[] _videoProfilesH264 = new[]
         private static readonly string[] _videoProfilesH264 = new[]
         {
         {
@@ -1221,7 +1223,7 @@ namespace MediaBrowser.Controller.MediaEncoding
 
 
             // Disable auto inserted SW scaler for HW decoders in case of changed resolution.
             // Disable auto inserted SW scaler for HW decoders in case of changed resolution.
             var isSwDecoder = string.IsNullOrEmpty(GetHardwareVideoDecoder(state, options));
             var isSwDecoder = string.IsNullOrEmpty(GetHardwareVideoDecoder(state, options));
-            if (!isSwDecoder && _mediaEncoder.EncoderVersion >= new Version(4, 4))
+            if (!isSwDecoder && _mediaEncoder.EncoderVersion >= _minFFmpegAutoscaleOption)
             {
             {
                 arg.Append(" -noautoscale");
                 arg.Append(" -noautoscale");
             }
             }
@@ -6393,6 +6395,16 @@ namespace MediaBrowser.Controller.MediaEncoding
             {
             {
                 inputModifier += " -re";
                 inputModifier += " -re";
             }
             }
+            else if (encodingOptions.EnableSegmentDeletion
+                && state.VideoStream is not null
+                && state.TranscodingType == TranscodingJobType.Hls
+                && IsCopyCodec(state.OutputVideoCodec)
+                && _mediaEncoder.EncoderVersion >= _minFFmpegReadrateOption)
+            {
+                // Set an input read rate limit 10x for using SegmentDeletion with stream-copy
+                // to prevent ffmpeg from exiting prematurely (due to fast drive)
+                inputModifier += " -readrate 10";
+            }
 
 
             var flags = new List<string>();
             var flags = new List<string>();
             if (state.IgnoreInputDts)
             if (state.IgnoreInputDts)