using MediaBrowser.Controller.MediaEncoding; using MediaBrowser.Model.Configuration; using MediaBrowser.Model.Entities; using System; using System.Collections.Generic; using System.Globalization; using System.Linq; namespace MediaBrowser.MediaEncoding.Encoder { public static class EncodingUtils { private static readonly CultureInfo UsCulture = new CultureInfo("en-US"); public static string GetInputArgument(List inputFiles, bool isRemote) { if (isRemote) { return GetHttpInputArgument(inputFiles); } return GetConcatInputArgument(inputFiles); } /// /// Gets the concat input argument. /// /// The input files. /// System.String. private static string GetConcatInputArgument(IReadOnlyList inputFiles) { // Get all streams // If there's more than one we'll need to use the concat command if (inputFiles.Count > 1) { var files = string.Join("|", inputFiles); return string.Format("concat:\"{0}\"", files); } // Determine the input path for video files return GetFileInputArgument(inputFiles[0]); } /// /// Gets the file input argument. /// /// The path. /// System.String. private static string GetFileInputArgument(string path) { return string.Format("file:\"{0}\"", path); } /// /// Gets the HTTP input argument. /// /// The input files. /// System.String. private static string GetHttpInputArgument(IEnumerable inputFiles) { var url = inputFiles.First(); return string.Format("\"{0}\"", url); } private static string GetFastSeekValue(EncodingOptions options) { var time = options.StartTimeTicks; if (time.HasValue) { var seconds = TimeSpan.FromTicks(time.Value).TotalSeconds; if (seconds > 0) { return string.Format("-ss {0}", seconds.ToString(UsCulture)); } } return string.Empty; } public static string GetProbeSizeArgument(bool isDvd) { return isDvd ? "-probesize 1G -analyzeduration 200M" : string.Empty; } /// /// Gets the number of audio channels to specify on the command line /// /// The request. /// The audio stream. /// System.Nullable{System.Int32}. public static int? GetNumAudioChannelsParam(EncodingOptions request, MediaStream audioStream) { if (audioStream != null) { var codec = request.AudioCodec ?? string.Empty; if (audioStream.Channels > 2 && codec.IndexOf("wma", StringComparison.OrdinalIgnoreCase) != -1) { // wmav2 currently only supports two channel output return 2; } } if (request.MaxAudioChannels.HasValue) { if (audioStream != null && audioStream.Channels.HasValue) { return Math.Min(request.MaxAudioChannels.Value, audioStream.Channels.Value); } return request.MaxAudioChannels.Value; } return request.AudioChannels; } } }