浏览代码

Change transcoderChannelLimit default to 8

Change transcoderChannelLimit default to 8 from 6
Switch to querying for encoder and added more cases to transcoderChannelLimit
Refactor GetNumAudioChannelsParam
holow29 2 年之前
父节点
当前提交
724d2986a3
共有 1 个文件被更改,包括 35 次插入63 次删除
  1. 35 63
      MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs

+ 35 - 63
MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs

@@ -2211,85 +2211,57 @@ namespace MediaBrowser.Controller.MediaEncoding
 
             var request = state.BaseRequest;
 
-            var inputChannels = audioStream.Channels;
+            var codec = outputAudioCodec ?? string.Empty;
 
-            if (inputChannels <= 0)
-            {
-                inputChannels = null;
-            }
+            int? resultChannels = state.GetRequestedAudioChannels(codec);
 
-            var codec = outputAudioCodec ?? string.Empty;
+            var inputChannels = audioStream.Channels;
 
-            int? transcoderChannelLimit;
-            if (codec.IndexOf("wma", StringComparison.OrdinalIgnoreCase) != -1)
-            {
-                // wmav2 currently only supports two channel output
-                transcoderChannelLimit = 2;
-            }
-            else if (codec.IndexOf("mp3", StringComparison.OrdinalIgnoreCase) != -1)
+            if (inputChannels > 0)
             {
-                // libmp3lame currently only supports two channel output
-                transcoderChannelLimit = 2;
-            }
-            else if (codec.IndexOf("aac", StringComparison.OrdinalIgnoreCase) != -1)
-            {
-                // aac is able to handle 8ch(7.1 layout)
-                transcoderChannelLimit = 8;
-            }
-            else
-            {
-                // If we don't have any media info then limit it to 6 to prevent encoding errors due to asking for too many channels
-                transcoderChannelLimit = 6;
+                resultChannels = inputChannels < resultChannels ? inputChannels : resultChannels ?? inputChannels;
             }
 
             var isTranscodingAudio = !IsCopyCodec(codec);
 
-            int? resultChannels = state.GetRequestedAudioChannels(codec);
             if (isTranscodingAudio)
             {
-                resultChannels = GetMinValue(request.TranscodingMaxAudioChannels, resultChannels);
-            }
-
-            if (inputChannels.HasValue)
-            {
-                resultChannels = resultChannels.HasValue
-                    ? Math.Min(resultChannels.Value, inputChannels.Value)
-                    : inputChannels.Value;
-            }
+                // Set max transcoding channels for encoders that can't handle more than a set amount of channels
+                // AAC, FLAC, ALAC, libopus, libvorbis encoders all support at least 8 channels
+                int transcoderChannelLimit = GetAudioEncoder(state) switch
+                {
+                    string audioEncoder when audioEncoder.Equals("wmav2", StringComparison.OrdinalIgnoreCase)
+                                          || audioEncoder.Equals("libmp3lame", StringComparison.OrdinalIgnoreCase) => 2,
+                    string audioEncoder when audioEncoder.Equals("libfdk_aac", StringComparison.OrdinalIgnoreCase)
+                                          || audioEncoder.Equals("aac_at", StringComparison.OrdinalIgnoreCase)
+                                          || audioEncoder.Equals("ac3", StringComparison.OrdinalIgnoreCase)
+                                          || audioEncoder.Equals("eac3", StringComparison.OrdinalIgnoreCase)
+                                          || audioEncoder.Equals("dts", StringComparison.OrdinalIgnoreCase)
+                                          || audioEncoder.Equals("mlp", StringComparison.OrdinalIgnoreCase)
+                                          || audioEncoder.Equals("truehd", StringComparison.OrdinalIgnoreCase) => 6,
+                    // Set default max transcoding channels to 8 to prevent encoding errors due to asking for too many channels
+                    _ => 8,
+                };
 
-            if (isTranscodingAudio && transcoderChannelLimit.HasValue)
-            {
-                resultChannels = resultChannels.HasValue
-                    ? Math.Min(resultChannels.Value, transcoderChannelLimit.Value)
-                    : transcoderChannelLimit.Value;
-            }
+                // Set resultChannels to minimum between resultChannels, TranscodingMaxAudioChannels, transcoderChannelLimit
 
-            // Avoid transcoding to audio channels other than 1ch, 2ch, 6ch (5.1 layout) and 8ch (7.1 layout).
-            // https://developer.apple.com/documentation/http_live_streaming/hls_authoring_specification_for_apple_devices
-            if (isTranscodingAudio
-                && state.TranscodingType != TranscodingJobType.Progressive
-                && resultChannels.HasValue
-                && ((resultChannels.Value > 2 && resultChannels.Value < 6) || resultChannels.Value == 7))
-            {
-                resultChannels = 2;
-            }
-
-            return resultChannels;
-        }
+                resultChannels = transcoderChannelLimit < resultChannels ? transcoderChannelLimit : resultChannels ?? transcoderChannelLimit;
 
-        private int? GetMinValue(int? val1, int? val2)
-        {
-            if (!val1.HasValue)
-            {
-                return val2;
-            }
+                if (request.TranscodingMaxAudioChannels < resultChannels)
+                {
+                    resultChannels = request.TranscodingMaxAudioChannels;
+                }
 
-            if (!val2.HasValue)
-            {
-                return val1;
+                // Avoid transcoding to audio channels other than 1ch, 2ch, 6ch (5.1 layout) and 8ch (7.1 layout).
+                // https://developer.apple.com/documentation/http_live_streaming/hls_authoring_specification_for_apple_devices
+                if (state.TranscodingType != TranscodingJobType.Progressive
+                    && ((resultChannels > 2 && resultChannels < 6) || resultChannels == 7))
+                {
+                    resultChannels = 2;
+                }
             }
 
-            return Math.Min(val1.Value, val2.Value);
+            return resultChannels;
         }
 
         /// <summary>