瀏覽代碼

Added some intelligence to the video handler. try to just copy the audio stream when possible, instead of encoding.

LukePulverenti Luke Pulverenti luke pulverenti 13 年之前
父節點
當前提交
5f5f2fcdb4

+ 2 - 38
MediaBrowser.Api/HttpHandlers/AudioHandler.cs

@@ -113,14 +113,14 @@ namespace MediaBrowser.Api.HttpHandlers
                 audioTranscodeParams.Add("-ab " + bitrate.Value);
                 audioTranscodeParams.Add("-ab " + bitrate.Value);
             }
             }
 
 
-            int? channels = GetNumAudioChannelsParam();
+            int? channels = GetNumAudioChannelsParam(LibraryItem.Channels);
 
 
             if (channels.HasValue)
             if (channels.HasValue)
             {
             {
                 audioTranscodeParams.Add("-ac " + channels.Value);
                 audioTranscodeParams.Add("-ac " + channels.Value);
             }
             }
 
 
-            int? sampleRate = GetSampleRateParam();
+            int? sampleRate = GetSampleRateParam(LibraryItem.SampleRate);
 
 
             if (sampleRate.HasValue)
             if (sampleRate.HasValue)
             {
             {
@@ -131,41 +131,5 @@ namespace MediaBrowser.Api.HttpHandlers
 
 
             return "-i \"" + LibraryItem.Path + "\" -vn " + string.Join(" ", audioTranscodeParams.ToArray()) + " -";
             return "-i \"" + LibraryItem.Path + "\" -vn " + string.Join(" ", audioTranscodeParams.ToArray()) + " -";
         }
         }
-
-        /// <summary>
-        /// Gets the number of audio channels to specify on the command line
-        /// </summary>
-        private int? GetNumAudioChannelsParam()
-        {
-            // If the user requested a max number of channels
-            if (AudioChannels.HasValue)
-            {
-                // Only specify the param if we're going to downmix
-                if (AudioChannels.Value < LibraryItem.Channels)
-                {
-                    return AudioChannels.Value;
-                }
-            }
-
-            return null;
-        }
-
-        /// <summary>
-        /// Gets the number of audio channels to specify on the command line
-        /// </summary>
-        private int? GetSampleRateParam()
-        {
-            // If the user requested a max value
-            if (AudioSampleRate.HasValue)
-            {
-                // Only specify the param if we're going to downmix
-                if (AudioSampleRate.Value < LibraryItem.SampleRate)
-                {
-                    return AudioSampleRate.Value;
-                }
-            }
-
-            return null;
-        }
     }
     }
 }
 }

+ 36 - 0
MediaBrowser.Api/HttpHandlers/BaseMediaHandler.cs

@@ -212,5 +212,41 @@ namespace MediaBrowser.Api.HttpHandlers
                 process.Dispose();
                 process.Dispose();
             }
             }
         }
         }
+
+        /// <summary>
+        /// Gets the number of audio channels to specify on the command line
+        /// </summary>
+        protected int? GetNumAudioChannelsParam(int libraryItemChannels)
+        {
+            // If the user requested a max number of channels
+            if (AudioChannels.HasValue)
+            {
+                // Only specify the param if we're going to downmix
+                if (AudioChannels.Value < libraryItemChannels)
+                {
+                    return AudioChannels.Value;
+                }
+            }
+
+            return null;
+        }
+
+        /// <summary>
+        /// Gets the number of audio channels to specify on the command line
+        /// </summary>
+        protected int? GetSampleRateParam(int libraryItemSampleRate)
+        {
+            // If the user requested a max value
+            if (AudioSampleRate.HasValue)
+            {
+                // Only specify the param if we're going to downmix
+                if (AudioSampleRate.Value < libraryItemSampleRate)
+                {
+                    return AudioSampleRate.Value;
+                }
+            }
+
+            return null;
+        }
     }
     }
 }
 }

+ 52 - 31
MediaBrowser.Api/HttpHandlers/VideoHandler.cs

@@ -1,8 +1,8 @@
 using System;
 using System;
 using System.Collections.Generic;
 using System.Collections.Generic;
+using System.IO;
 using System.Linq;
 using System.Linq;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.Entities;
-using System.IO;
 
 
 namespace MediaBrowser.Api.HttpHandlers
 namespace MediaBrowser.Api.HttpHandlers
 {
 {
@@ -102,21 +102,31 @@ namespace MediaBrowser.Api.HttpHandlers
 
 
         private string GetAudioArguments(string outputFormat)
         private string GetAudioArguments(string outputFormat)
         {
         {
-            string codec = GetAudioCodec(outputFormat);
+            AudioStream audioStream = LibraryItem.AudioStreams.FirstOrDefault();
+
+            if (audioStream == null)
+            {
+                return string.Empty;
+            }
+
+            string codec = GetAudioCodec(audioStream, outputFormat);
 
 
             string args = "-acodec " + codec;
             string args = "-acodec " + codec;
 
 
             if (!codec.Equals("copy", StringComparison.OrdinalIgnoreCase))
             if (!codec.Equals("copy", StringComparison.OrdinalIgnoreCase))
             {
             {
-                int? channels = GetNumAudioChannels(codec);
+                int? channels = GetNumAudioChannelsParam(codec, audioStream.Channels);
 
 
                 if (channels.HasValue)
                 if (channels.HasValue)
                 {
                 {
                     args += " -ac " + channels.Value;
                     args += " -ac " + channels.Value;
                 }
                 }
-                if (AudioSampleRate.HasValue)
+
+                int? sampleRate = GetSampleRateParam(audioStream.SampleRate);
+
+                if (sampleRate.HasValue)
                 {
                 {
-                    args += " -ar " + AudioSampleRate.Value;
+                    args += " -ar " + sampleRate.Value;
                 }
                 }
 
 
             }
             }
@@ -131,54 +141,65 @@ namespace MediaBrowser.Api.HttpHandlers
                 // Per webm specification, it must be vpx
                 // Per webm specification, it must be vpx
                 return "libvpx";
                 return "libvpx";
             }
             }
-            else if (outputFormat.Equals("flv"))
-            {
-                return "libx264";
-            }
-            else if (outputFormat.Equals("ts"))
-            {
-                return "libx264";
-            }
             else if (outputFormat.Equals("asf"))
             else if (outputFormat.Equals("asf"))
             {
             {
                 return "wmv2";
                 return "wmv2";
             }
             }
 
 
-            return "copy";
+            return "libx264";
         }
         }
-        
-        private string GetAudioCodec(string outputFormat)
+
+        private string GetAudioCodec(AudioStream audioStream, string outputFormat)
         {
         {
             if (outputFormat.Equals("webm"))
             if (outputFormat.Equals("webm"))
             {
             {
                 // Per webm specification, it must be vorbis
                 // Per webm specification, it must be vorbis
                 return "libvorbis";
                 return "libvorbis";
             }
             }
-            else if (outputFormat.Equals("flv"))
-            {
-                return "libvo_aacenc";
-            }
-            else if (outputFormat.Equals("ts"))
-            {
-                return "libvo_aacenc";
-            }
-            else if (outputFormat.Equals("asf"))
+
+            // See if we can just copy the stream
+            if (HasBasicAudio(audioStream))
             {
             {
-                return "libvo_aacenc";
+                return "copy";
             }
             }
 
 
-            return "copy";
+            return "libvo_aacenc";
         }
         }
 
 
-        private int? GetNumAudioChannels(string audioCodec)
+        private int? GetNumAudioChannelsParam(string audioCodec, int libraryItemChannels)
         {
         {
-            if (audioCodec.Equals("libvo_aacenc"))
+            if (libraryItemChannels > 2 && audioCodec.Equals("libvo_aacenc"))
             {
             {
                 // libvo_aacenc currently only supports two channel output
                 // libvo_aacenc currently only supports two channel output
                 return 2;
                 return 2;
             }
             }
-            
-            return AudioChannels;
+
+            return GetNumAudioChannelsParam(libraryItemChannels);
+        }
+
+        private bool HasBasicAudio(AudioStream audio)
+        {
+            int maxChannels = AudioChannels ?? 2;
+
+            if (audio.Channels > maxChannels)
+            {
+                return false;
+            }
+
+            if (audio.AudioFormat.IndexOf("aac", StringComparison.OrdinalIgnoreCase) != -1)
+            {
+                return true;
+            }
+            if (audio.AudioFormat.IndexOf("ac-3", StringComparison.OrdinalIgnoreCase) != -1 || audio.AudioFormat.IndexOf("ac3", StringComparison.OrdinalIgnoreCase) != -1)
+            {
+                return true;
+            }
+            if (audio.AudioFormat.IndexOf("mpeg", StringComparison.OrdinalIgnoreCase) != -1 || audio.AudioFormat.IndexOf("mp3", StringComparison.OrdinalIgnoreCase) != -1)
+            {
+                return true;
+            }
+
+            return false;
         }
         }
     }
     }
 }
 }