瀏覽代碼

Merge pull request #2160 from Artiume/master

Force Transcoding LiveTV
Vasily 5 年之前
父節點
當前提交
a075fefca9
共有 3 個文件被更改,包括 68 次插入29 次删除
  1. 1 0
      CONTRIBUTORS.md
  2. 65 28
      MediaBrowser.Api/Playback/MediaInfoService.cs
  3. 2 1
      MediaBrowser.Model/Users/UserPolicy.cs

+ 1 - 0
CONTRIBUTORS.md

@@ -34,6 +34,7 @@
  - [ullmie02](https://github.com/ullmie02)
  - [ullmie02](https://github.com/ullmie02)
  - [geilername](https://github.com/geilername)
  - [geilername](https://github.com/geilername)
  - [pR0Ps](https://github.com/pR0Ps)
  - [pR0Ps](https://github.com/pR0Ps)
+ - [artiume](https://github.com/Artiume)
 
 
 
 
 # Emby Contributors
 # Emby Contributors

+ 65 - 28
MediaBrowser.Api/Playback/MediaInfoService.cs

@@ -412,10 +412,12 @@ namespace MediaBrowser.Api.Playback
                     user.Policy.EnableAudioPlaybackTranscoding);
                     user.Policy.EnableAudioPlaybackTranscoding);
             }
             }
 
 
+            // Beginning of Playback Determination: Attempt DirectPlay first
             if (mediaSource.SupportsDirectPlay)
             if (mediaSource.SupportsDirectPlay)
             {
             {
-                if (mediaSource.IsRemote && forceDirectPlayRemoteMediaSource)
+                if (mediaSource.IsRemote && user.Policy.ForceRemoteSourceTranscoding)
                 {
                 {
+                    mediaSource.SupportsDirectPlay = false;
                 }
                 }
                 else
                 else
                 {
                 {
@@ -462,36 +464,43 @@ namespace MediaBrowser.Api.Playback
 
 
             if (mediaSource.SupportsDirectStream)
             if (mediaSource.SupportsDirectStream)
             {
             {
-                options.MaxBitrate = GetMaxBitrate(maxBitrate, user);
-
-                if (item is Audio)
+                if (mediaSource.IsRemote && user.Policy.ForceRemoteSourceTranscoding)
                 {
                 {
-                    if (!user.Policy.EnableAudioPlaybackTranscoding)
-                    {
-                        options.ForceDirectStream = true;
-                    }
+                    mediaSource.SupportsDirectStream = false;
                 }
                 }
-                else if (item is Video)
+                else
                 {
                 {
-                    if (!user.Policy.EnableAudioPlaybackTranscoding && !user.Policy.EnableVideoPlaybackTranscoding && !user.Policy.EnablePlaybackRemuxing)
+                    options.MaxBitrate = GetMaxBitrate(maxBitrate, user);
+                    
+                    if (item is Audio)
                     {
                     {
-                        options.ForceDirectStream = true;
+                        if (!user.Policy.EnableAudioPlaybackTranscoding)
+                        {
+                            options.ForceDirectStream = true;
+                        }
+                    }
+                    else if (item is Video)
+                    {
+                        if (!user.Policy.EnableAudioPlaybackTranscoding && !user.Policy.EnableVideoPlaybackTranscoding && !user.Policy.EnablePlaybackRemuxing)
+                        {
+                            options.ForceDirectStream = true;
+                        }
                     }
                     }
-                }
 
 
                 // The MediaSource supports direct stream, now test to see if the client supports it
                 // The MediaSource supports direct stream, now test to see if the client supports it
                 var streamInfo = string.Equals(item.MediaType, MediaType.Audio, StringComparison.OrdinalIgnoreCase)
                 var streamInfo = string.Equals(item.MediaType, MediaType.Audio, StringComparison.OrdinalIgnoreCase)
                     ? streamBuilder.BuildAudioItem(options)
                     ? streamBuilder.BuildAudioItem(options)
                     : streamBuilder.BuildVideoItem(options);
                     : streamBuilder.BuildVideoItem(options);
 
 
-                if (streamInfo == null || !streamInfo.IsDirectStream)
-                {
-                    mediaSource.SupportsDirectStream = false;
-                }
+                    if (streamInfo == null || !streamInfo.IsDirectStream)
+                    {
+                        mediaSource.SupportsDirectStream = false;
+                    }
 
 
-                if (streamInfo != null)
-                {
-                    SetDeviceSpecificSubtitleInfo(streamInfo, mediaSource, auth.Token);
+                    if (streamInfo != null)
+                    {
+                        SetDeviceSpecificSubtitleInfo(streamInfo, mediaSource, auth.Token);
+                    }
                 }
                 }
             }
             }
 
 
@@ -504,18 +513,46 @@ namespace MediaBrowser.Api.Playback
                     ? streamBuilder.BuildAudioItem(options)
                     ? streamBuilder.BuildAudioItem(options)
                     : streamBuilder.BuildVideoItem(options);
                     : streamBuilder.BuildVideoItem(options);
 
 
-                if (streamInfo != null)
+                if (mediaSource.IsRemote && user.Policy.ForceRemoteSourceTranscoding)
                 {
                 {
-                    streamInfo.PlaySessionId = playSessionId;
-
-                    if (streamInfo.PlayMethod == PlayMethod.Transcode)
+                    if (streamInfo != null)
                     {
                     {
+                        streamInfo.PlaySessionId = playSessionId;    
                         streamInfo.StartPositionTicks = startTimeTicks;
                         streamInfo.StartPositionTicks = startTimeTicks;
                         mediaSource.TranscodingUrl = streamInfo.ToUrl("-", auth.Token).TrimStart('-');
                         mediaSource.TranscodingUrl = streamInfo.ToUrl("-", auth.Token).TrimStart('-');
+                        mediaSource.TranscodingUrl += "&allowVideoStreamCopy=false";
+                        if (!allowAudioStreamCopy)
+                        {
+                            mediaSource.TranscodingUrl += "&allowAudioStreamCopy=false";
+                        }
+                        mediaSource.TranscodingContainer = streamInfo.Container;
+                        mediaSource.TranscodingSubProtocol = streamInfo.SubProtocol;
+                        
+                        // Do this after the above so that StartPositionTicks is set
+                        SetDeviceSpecificSubtitleInfo(streamInfo, mediaSource, auth.Token);
+                    }				
+                }
+                else
+                {
+                    if (streamInfo != null)
+                    {
+                        streamInfo.PlaySessionId = playSessionId;
 
 
-                        if (!allowVideoStreamCopy)
+                        if (streamInfo.PlayMethod == PlayMethod.Transcode)
                         {
                         {
-                            mediaSource.TranscodingUrl += "&allowVideoStreamCopy=false";
+                            streamInfo.StartPositionTicks = startTimeTicks;
+                            mediaSource.TranscodingUrl = streamInfo.ToUrl("-", auth.Token).TrimStart('-');
+
+                            if (!allowVideoStreamCopy)
+                            {
+                                mediaSource.TranscodingUrl += "&allowVideoStreamCopy=false";
+                            }
+                            if (!allowAudioStreamCopy)
+                            {
+                                mediaSource.TranscodingUrl += "&allowAudioStreamCopy=false";
+                            }
+                            mediaSource.TranscodingContainer = streamInfo.Container;
+                            mediaSource.TranscodingSubProtocol = streamInfo.SubProtocol;
                         }
                         }
 
 
                         if (!allowAudioStreamCopy)
                         if (!allowAudioStreamCopy)
@@ -525,10 +562,10 @@ namespace MediaBrowser.Api.Playback
 
 
                         mediaSource.TranscodingContainer = streamInfo.Container;
                         mediaSource.TranscodingContainer = streamInfo.Container;
                         mediaSource.TranscodingSubProtocol = streamInfo.SubProtocol;
                         mediaSource.TranscodingSubProtocol = streamInfo.SubProtocol;
-                    }
 
 
-                    // Do this after the above so that StartPositionTicks is set
-                    SetDeviceSpecificSubtitleInfo(streamInfo, mediaSource, auth.Token);
+                        // Do this after the above so that StartPositionTicks is set
+                        SetDeviceSpecificSubtitleInfo(streamInfo, mediaSource, auth.Token);
+                    }
                 }
                 }
             }
             }
 
 

+ 2 - 1
MediaBrowser.Model/Users/UserPolicy.cs

@@ -47,6 +47,7 @@ namespace MediaBrowser.Model.Users
         public bool EnableAudioPlaybackTranscoding { get; set; }
         public bool EnableAudioPlaybackTranscoding { get; set; }
         public bool EnableVideoPlaybackTranscoding { get; set; }
         public bool EnableVideoPlaybackTranscoding { get; set; }
         public bool EnablePlaybackRemuxing { get; set; }
         public bool EnablePlaybackRemuxing { get; set; }
+        public bool ForceRemoteSourceTranscoding { get; set; }
 
 
         public bool EnableContentDeletion { get; set; }
         public bool EnableContentDeletion { get; set; }
         public string[] EnableContentDeletionFromFolders { get; set; }
         public string[] EnableContentDeletionFromFolders { get; set; }
@@ -94,7 +95,7 @@ namespace MediaBrowser.Model.Users
             EnableAudioPlaybackTranscoding = true;
             EnableAudioPlaybackTranscoding = true;
             EnableVideoPlaybackTranscoding = true;
             EnableVideoPlaybackTranscoding = true;
             EnablePlaybackRemuxing = true;
             EnablePlaybackRemuxing = true;
-
+            ForceRemoteSourceTranscoding = false;
             EnableLiveTvManagement = true;
             EnableLiveTvManagement = true;
             EnableLiveTvAccess = true;
             EnableLiveTvAccess = true;