浏览代码

vary bitrate params depending on input resolution requested

Luke Pulverenti 11 年之前
父节点
当前提交
20c711b248
共有 2 个文件被更改,包括 46 次插入6 次删除
  1. 34 6
      MediaBrowser.Api/Playback/BaseStreamingService.cs
  2. 12 0
      MediaBrowser.Api/Playback/StreamRequest.cs

+ 34 - 6
MediaBrowser.Api/Playback/BaseStreamingService.cs

@@ -305,27 +305,39 @@ namespace MediaBrowser.Api.Playback
         {
         {
             var param = string.Empty;
             var param = string.Empty;
 
 
+            var hasFixedResolution = state.VideoRequest.HasFixedResolution;
+
             if (string.Equals(videoCodec, "libx264", StringComparison.OrdinalIgnoreCase))
             if (string.Equals(videoCodec, "libx264", StringComparison.OrdinalIgnoreCase))
             {
             {
                 switch (GetQualitySetting())
                 switch (GetQualitySetting())
                 {
                 {
                     case EncodingQuality.HighSpeed:
                     case EncodingQuality.HighSpeed:
-                        param = "-preset ultrafast -crf 18";
+                        param = "-preset ultrafast";
                         break;
                         break;
                     case EncodingQuality.HighQuality:
                     case EncodingQuality.HighQuality:
-                        param = "-preset superfast -crf 18";
+                        param = "-preset superfast";
                         break;
                         break;
                     case EncodingQuality.MaxQuality:
                     case EncodingQuality.MaxQuality:
-                        param = "-preset superfast -crf 18";
+                        param = "-preset superfast";
                         break;
                         break;
                 }
                 }
+
+                if (!hasFixedResolution)
+                {
+                    param += " crf18";
+                }
             }
             }
 
 
             // webm
             // webm
             else if (string.Equals(videoCodec, "libvpx", StringComparison.OrdinalIgnoreCase))
             else if (string.Equals(videoCodec, "libvpx", StringComparison.OrdinalIgnoreCase))
             {
             {
                 // http://www.webmproject.org/docs/encoder-parameters/
                 // http://www.webmproject.org/docs/encoder-parameters/
-                param = "-speed 16 -quality good -profile:v 0 -slices 8 -crf 18";
+                param = "-speed 16 -quality good -profile:v 0 -slices 8";
+
+                if (!hasFixedResolution)
+                {
+                    param += " crf18";
+                }
             }
             }
 
 
             else if (string.Equals(videoCodec, "mpeg4", StringComparison.OrdinalIgnoreCase))
             else if (string.Equals(videoCodec, "mpeg4", StringComparison.OrdinalIgnoreCase))
@@ -941,21 +953,37 @@ namespace MediaBrowser.Api.Playback
 
 
             if (bitrate.HasValue)
             if (bitrate.HasValue)
             {
             {
+                var hasFixedResolution = state.VideoRequest.HasFixedResolution;
+
                 if (isHls)
                 if (isHls)
                 {
                 {
                     return string.Format(" -b:v {0} -maxrate ({0}*.80) -bufsize {0}", bitrate.Value.ToString(UsCulture));
                     return string.Format(" -b:v {0} -maxrate ({0}*.80) -bufsize {0}", bitrate.Value.ToString(UsCulture));
                 }
                 }
 
 
-                // With vpx when crf is used, b:v becomes a max rate
-                // https://trac.ffmpeg.org/wiki/vpxEncodingGuide
                 if (string.Equals(videoCodec, "libvpx", StringComparison.OrdinalIgnoreCase))
                 if (string.Equals(videoCodec, "libvpx", StringComparison.OrdinalIgnoreCase))
                 {
                 {
+                    if (hasFixedResolution)
+                    {
+                        return string.Format(" -minrate:v ({0}*.90) -maxrate:v ({0}*1.10) -bufsize:v {0} -b:v {0}", bitrate.Value.ToString(UsCulture));
+                    }
+
+                    // With vpx when crf is used, b:v becomes a max rate
+                    // https://trac.ffmpeg.org/wiki/vpxEncodingGuide
                     return string.Format(" -b:v {0}", bitrate.Value.ToString(UsCulture));
                     return string.Format(" -b:v {0}", bitrate.Value.ToString(UsCulture));
                 }
                 }
+
                 if (string.Equals(videoCodec, "msmpeg4", StringComparison.OrdinalIgnoreCase))
                 if (string.Equals(videoCodec, "msmpeg4", StringComparison.OrdinalIgnoreCase))
                 {
                 {
                     return string.Format(" -b:v {0}", bitrate.Value.ToString(UsCulture));
                     return string.Format(" -b:v {0}", bitrate.Value.ToString(UsCulture));
                 }
                 }
+
+
+                // H264
+                if (hasFixedResolution)
+                {
+                    return string.Format(" -b:v {0}", bitrate.Value.ToString(UsCulture));
+                }
+
                 return string.Format(" -maxrate {0} -bufsize {1}",
                 return string.Format(" -maxrate {0} -bufsize {1}",
                     bitrate.Value.ToString(UsCulture),
                     bitrate.Value.ToString(UsCulture),
                     (bitrate.Value * 2).ToString(UsCulture));
                     (bitrate.Value * 2).ToString(UsCulture));

+ 12 - 0
MediaBrowser.Api/Playback/StreamRequest.cs

@@ -157,5 +157,17 @@ namespace MediaBrowser.Api.Playback
         /// <value>The level.</value>
         /// <value>The level.</value>
         [ApiMember(Name = "Level", Description = "Optional. Specify a level for the h264 profile, e.g. 3, 3.1.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
         [ApiMember(Name = "Level", Description = "Optional. Specify a level for the h264 profile, e.g. 3, 3.1.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
         public string Level { get; set; }
         public string Level { get; set; }
+
+        /// <summary>
+        /// Gets a value indicating whether this instance has fixed resolution.
+        /// </summary>
+        /// <value><c>true</c> if this instance has fixed resolution; otherwise, <c>false</c>.</value>
+        public bool HasFixedResolution
+        {
+            get
+            {
+                return Width.HasValue || Height.HasValue;
+            }
+        }
     }
     }
 }
 }