From 21fd761b05584481d9f6293ca48e373f356c80b6 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Mon, 16 Jun 2014 21:56:23 -0400 Subject: fixes #838 - Support rtmp protocol with channels --- .../Encoder/EncodingUtils.cs | 48 ++++++---------------- MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs | 40 +++++++++--------- .../Subtitles/SubtitleEncoder.cs | 23 ++++------- 3 files changed, 41 insertions(+), 70 deletions(-) (limited to 'MediaBrowser.MediaEncoding') diff --git a/MediaBrowser.MediaEncoding/Encoder/EncodingUtils.cs b/MediaBrowser.MediaEncoding/Encoder/EncodingUtils.cs index 9bd2e92709..bf4daf7867 100644 --- a/MediaBrowser.MediaEncoding/Encoder/EncodingUtils.cs +++ b/MediaBrowser.MediaEncoding/Encoder/EncodingUtils.cs @@ -1,22 +1,27 @@ using MediaBrowser.Controller.MediaEncoding; -using MediaBrowser.Model.Configuration; using MediaBrowser.Model.Entities; +using MediaBrowser.Model.MediaInfo; 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) + public static string GetInputArgument(List inputFiles, MediaProtocol protocol) { - if (isRemote) + if (protocol == MediaProtocol.Http) { - return GetHttpInputArgument(inputFiles); + var url = inputFiles.First(); + + return string.Format("\"{0}\"", url); + } + if (protocol == MediaProtocol.Rtmp) + { + var url = inputFiles.First(); + + return string.Format("\"{0}\"", url); } return GetConcatInputArgument(inputFiles); @@ -52,35 +57,6 @@ namespace MediaBrowser.MediaEncoding.Encoder 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; diff --git a/MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs b/MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs index d532d100f9..6cb7e8ce36 100644 --- a/MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs +++ b/MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs @@ -3,6 +3,7 @@ using MediaBrowser.Common.IO; using MediaBrowser.Controller.MediaEncoding; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Logging; +using MediaBrowser.Model.MediaInfo; using MediaBrowser.Model.Serialization; using System; using System.Collections.Concurrent; @@ -102,37 +103,38 @@ namespace MediaBrowser.MediaEncoding.Encoder /// Gets the media info. /// /// The input files. - /// The type. + /// The protocol. /// if set to true [is audio]. /// The cancellation token. /// Task. - public Task GetMediaInfo(string[] inputFiles, InputType type, bool isAudio, + public Task GetMediaInfo(string[] inputFiles, MediaProtocol protocol, bool isAudio, CancellationToken cancellationToken) { - return GetMediaInfoInternal(GetInputArgument(inputFiles, type), !isAudio, - GetProbeSizeArgument(type), cancellationToken); + return GetMediaInfoInternal(GetInputArgument(inputFiles, protocol), !isAudio, + GetProbeSizeArgument(inputFiles, protocol), cancellationToken); } /// /// Gets the input argument. /// /// The input files. - /// The type. + /// The protocol. /// System.String. /// Unrecognized InputType - public string GetInputArgument(string[] inputFiles, InputType type) + public string GetInputArgument(string[] inputFiles, MediaProtocol protocol) { - return EncodingUtils.GetInputArgument(inputFiles.ToList(), type == InputType.Url); + return EncodingUtils.GetInputArgument(inputFiles.ToList(), protocol); } /// /// Gets the probe size argument. /// - /// The type. + /// The input files. + /// The protocol. /// System.String. - public string GetProbeSizeArgument(InputType type) + public string GetProbeSizeArgument(string[] inputFiles, MediaProtocol protocol) { - return EncodingUtils.GetProbeSizeArgument(type == InputType.Dvd); + return EncodingUtils.GetProbeSizeArgument(inputFiles.Length > 0); } /// @@ -287,27 +289,27 @@ namespace MediaBrowser.MediaEncoding.Encoder public Task ExtractAudioImage(string path, CancellationToken cancellationToken) { - return ExtractImage(new[] { path }, InputType.File, true, null, null, cancellationToken); + return ExtractImage(new[] { path }, MediaProtocol.File, true, null, null, cancellationToken); } - public Task ExtractVideoImage(string[] inputFiles, InputType type, Video3DFormat? threedFormat, + public Task ExtractVideoImage(string[] inputFiles, MediaProtocol protocol, Video3DFormat? threedFormat, TimeSpan? offset, CancellationToken cancellationToken) { - return ExtractImage(inputFiles, type, false, threedFormat, offset, cancellationToken); + return ExtractImage(inputFiles, protocol, false, threedFormat, offset, cancellationToken); } - private async Task ExtractImage(string[] inputFiles, InputType type, bool isAudio, + private async Task ExtractImage(string[] inputFiles, MediaProtocol protocol, bool isAudio, Video3DFormat? threedFormat, TimeSpan? offset, CancellationToken cancellationToken) { var resourcePool = isAudio ? _audioImageResourcePool : _videoImageResourcePool; - var inputArgument = GetInputArgument(inputFiles, type); + var inputArgument = GetInputArgument(inputFiles, protocol); if (!isAudio) { try { - return await ExtractImageInternal(inputArgument, type, threedFormat, offset, true, resourcePool, cancellationToken).ConfigureAwait(false); + return await ExtractImageInternal(inputArgument, protocol, threedFormat, offset, true, resourcePool, cancellationToken).ConfigureAwait(false); } catch { @@ -315,10 +317,10 @@ namespace MediaBrowser.MediaEncoding.Encoder } } - return await ExtractImageInternal(inputArgument, type, threedFormat, offset, false, resourcePool, cancellationToken).ConfigureAwait(false); + return await ExtractImageInternal(inputArgument, protocol, threedFormat, offset, false, resourcePool, cancellationToken).ConfigureAwait(false); } - private async Task ExtractImageInternal(string inputPath, InputType type, Video3DFormat? threedFormat, TimeSpan? offset, bool useIFrame, SemaphoreSlim resourcePool, CancellationToken cancellationToken) + private async Task ExtractImageInternal(string inputPath, MediaProtocol protocol, Video3DFormat? threedFormat, TimeSpan? offset, bool useIFrame, SemaphoreSlim resourcePool, CancellationToken cancellationToken) { if (string.IsNullOrEmpty(inputPath)) { @@ -357,7 +359,7 @@ namespace MediaBrowser.MediaEncoding.Encoder var args = useIFrame ? string.Format("-i {0} -threads 0 -v quiet -vframes 1 -vf \"{2},thumbnail=30\" -f image2 \"{1}\"", inputPath, "-", vf) : string.Format("-i {0} -threads 0 -v quiet -vframes 1 -vf \"{2}\" -f image2 \"{1}\"", inputPath, "-", vf); - var probeSize = GetProbeSizeArgument(type); + var probeSize = GetProbeSizeArgument(new[] { inputPath }, protocol); if (!string.IsNullOrEmpty(probeSize)) { diff --git a/MediaBrowser.MediaEncoding/Subtitles/SubtitleEncoder.cs b/MediaBrowser.MediaEncoding/Subtitles/SubtitleEncoder.cs index 5d066ee654..154541316d 100644 --- a/MediaBrowser.MediaEncoding/Subtitles/SubtitleEncoder.cs +++ b/MediaBrowser.MediaEncoding/Subtitles/SubtitleEncoder.cs @@ -127,26 +127,19 @@ namespace MediaBrowser.MediaEncoding.Subtitles var subtitleStream = mediaSource.MediaStreams .First(i => i.Type == MediaStreamType.Subtitle && i.Index == subtitleStreamIndex); - var inputType = mediaSource.LocationType == LocationType.Remote ? InputType.Url : InputType.File; var inputFiles = new[] { mediaSource.Path }; if (mediaSource.VideoType.HasValue) { - if (mediaSource.VideoType.Value == VideoType.BluRay) + if (mediaSource.VideoType.Value == VideoType.BluRay || + mediaSource.VideoType.Value == VideoType.Dvd) { - inputType = InputType.Bluray; - var mediaSourceItem = (Video)_libraryManager.GetItemById(new Guid(mediaSourceId)); - inputFiles = mediaSourceItem.GetPlayableStreamFiles().ToArray(); - } - else if (mediaSource.VideoType.Value == VideoType.Dvd) - { - inputType = InputType.Dvd; var mediaSourceItem = (Video)_libraryManager.GetItemById(new Guid(mediaSourceId)); inputFiles = mediaSourceItem.GetPlayableStreamFiles().ToArray(); } } - var fileInfo = await GetReadableFile(mediaSource.Path, inputFiles, inputType, subtitleStream, cancellationToken).ConfigureAwait(false); + var fileInfo = await GetReadableFile(mediaSource.Path, inputFiles, mediaSource.Protocol, subtitleStream, cancellationToken).ConfigureAwait(false); var stream = await GetSubtitleStream(fileInfo.Item1, subtitleStream.Language).ConfigureAwait(false); @@ -180,7 +173,7 @@ namespace MediaBrowser.MediaEncoding.Subtitles private async Task> GetReadableFile(string mediaPath, string[] inputFiles, - InputType type, + MediaProtocol protocol, MediaStream subtitleStream, CancellationToken cancellationToken) { @@ -189,7 +182,7 @@ namespace MediaBrowser.MediaEncoding.Subtitles // Extract var outputPath = GetSubtitleCachePath(mediaPath, subtitleStream.Index, ".ass"); - await ExtractTextSubtitle(inputFiles, type, subtitleStream.Index, false, outputPath, cancellationToken) + await ExtractTextSubtitle(inputFiles, protocol, subtitleStream.Index, false, outputPath, cancellationToken) .ConfigureAwait(false); return new Tuple(outputPath, "ass"); @@ -451,14 +444,14 @@ namespace MediaBrowser.MediaEncoding.Subtitles /// Extracts the text subtitle. /// /// The input files. - /// The type. + /// The protocol. /// Index of the subtitle stream. /// if set to true, copy stream instead of converting. /// The output path. /// The cancellation token. /// Task. /// Must use inputPath list overload - private async Task ExtractTextSubtitle(string[] inputFiles, InputType type, int subtitleStreamIndex, + private async Task ExtractTextSubtitle(string[] inputFiles, MediaProtocol protocol, int subtitleStreamIndex, bool copySubtitleStream, string outputPath, CancellationToken cancellationToken) { var semaphore = GetLock(outputPath); @@ -469,7 +462,7 @@ namespace MediaBrowser.MediaEncoding.Subtitles { if (!File.Exists(outputPath)) { - await ExtractTextSubtitleInternal(_mediaEncoder.GetInputArgument(inputFiles, type), subtitleStreamIndex, + await ExtractTextSubtitleInternal(_mediaEncoder.GetInputArgument(inputFiles, protocol), subtitleStreamIndex, copySubtitleStream, outputPath, cancellationToken).ConfigureAwait(false); } } -- cgit v1.2.3