aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Api
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Api')
-rw-r--r--MediaBrowser.Api/Playback/BaseStreamingService.cs34
-rw-r--r--MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs10
-rw-r--r--MediaBrowser.Api/Playback/Hls/VideoHlsService.cs10
-rw-r--r--MediaBrowser.Api/Playback/Progressive/VideoService.cs16
-rw-r--r--MediaBrowser.Api/Playback/StreamState.cs3
5 files changed, 54 insertions, 19 deletions
diff --git a/MediaBrowser.Api/Playback/BaseStreamingService.cs b/MediaBrowser.Api/Playback/BaseStreamingService.cs
index 394ca69d5a..76cce0d66d 100644
--- a/MediaBrowser.Api/Playback/BaseStreamingService.cs
+++ b/MediaBrowser.Api/Playback/BaseStreamingService.cs
@@ -307,7 +307,7 @@ namespace MediaBrowser.Api.Playback
if (videoCodec.Equals("libvpx", StringComparison.OrdinalIgnoreCase))
{
// http://www.webmproject.org/docs/encoder-parameters/
- return "-speed 16 -quality good -profile:v 0 -slices 8";
+ return "-speed 16 -quality good -profile:v 0 -slices 8 -crf 18";
}
// asf/wmv
@@ -321,11 +321,11 @@ namespace MediaBrowser.Api.Playback
switch (GetQualitySetting())
{
case EncodingQuality.HighSpeed:
- return "-preset ultrafast";
+ return "-preset ultrafast -crf 18";
case EncodingQuality.HighQuality:
- return "-preset superfast";
+ return "-preset superfast -crf 18";
case EncodingQuality.MaxQuality:
- return "-preset superfast";
+ return "-preset superfast -crf 18";
default:
throw new Exception("Unrecognized MediaEncodingQuality value.");
}
@@ -381,7 +381,7 @@ namespace MediaBrowser.Api.Playback
audioSampleRate,
volParam,
pts,
- state.AudioSync.ToString(UsCulture));
+ state.AudioSync);
}
/// <summary>
@@ -994,6 +994,26 @@ namespace MediaBrowser.Api.Playback
}
}
+ protected double? GetFramerateParam(StreamState state)
+ {
+ if (state.VideoRequest != null && state.VideoRequest.Framerate.HasValue)
+ {
+ return state.VideoRequest.Framerate.Value;
+ }
+
+ if (state.VideoStream != null)
+ {
+ var contentRate = state.VideoStream.AverageFrameRate ?? state.VideoStream.RealFrameRate;
+
+ if (contentRate.HasValue && contentRate.Value > 23.976)
+ {
+ return 23.976;
+ }
+ }
+
+ return null;
+ }
+
/// <summary>
/// Gets the state.
/// </summary>
@@ -1068,7 +1088,7 @@ namespace MediaBrowser.Api.Playback
//state.RunTimeTicks = recording.RunTimeTicks;
state.ReadInputAtNativeFramerate = recording.RecordingInfo.Status == RecordingStatus.InProgress;
state.SendInputOverStandardInput = recording.RecordingInfo.Status == RecordingStatus.InProgress;
- state.AudioSync = 1000;
+ state.AudioSync = "1000";
state.DeInterlace = true;
}
else if (item is LiveTvChannel)
@@ -1096,7 +1116,7 @@ namespace MediaBrowser.Api.Playback
state.SendInputOverStandardInput = true;
state.ReadInputAtNativeFramerate = true;
- state.AudioSync = 1000;
+ state.AudioSync = "1000";
state.DeInterlace = true;
}
else
diff --git a/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs b/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs
index f064a13c6b..388339f171 100644
--- a/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs
+++ b/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs
@@ -317,12 +317,16 @@ namespace MediaBrowser.Api.Playback.Hls
}
}
- if (state.VideoRequest.Framerate.HasValue)
+ var framerate = GetFramerateParam(state);
+ if (framerate.HasValue)
{
- args += string.Format(" -r {0}", state.VideoRequest.Framerate.Value);
+ args += string.Format(" -r {0}", framerate.Value.ToString(UsCulture));
}
- args += " -vsync vfr";
+ if (!string.IsNullOrEmpty(state.VideoSync))
+ {
+ args += " -vsync " + state.VideoSync;
+ }
if (!string.IsNullOrEmpty(state.VideoRequest.Profile))
{
diff --git a/MediaBrowser.Api/Playback/Hls/VideoHlsService.cs b/MediaBrowser.Api/Playback/Hls/VideoHlsService.cs
index 7e7e8ba5bd..9d9c62a28e 100644
--- a/MediaBrowser.Api/Playback/Hls/VideoHlsService.cs
+++ b/MediaBrowser.Api/Playback/Hls/VideoHlsService.cs
@@ -194,12 +194,16 @@ namespace MediaBrowser.Api.Playback.Hls
}
}
- if (state.VideoRequest.Framerate.HasValue)
+ var framerate = GetFramerateParam(state);
+ if (framerate.HasValue)
{
- args += string.Format(" -r {0}", state.VideoRequest.Framerate.Value);
+ args += string.Format(" -r {0}", framerate.Value.ToString(UsCulture));
}
- args += " -vsync vfr";
+ if (!string.IsNullOrEmpty(state.VideoSync))
+ {
+ args += " -vsync " + state.VideoSync;
+ }
if (!string.IsNullOrEmpty(state.VideoRequest.Profile))
{
diff --git a/MediaBrowser.Api/Playback/Progressive/VideoService.cs b/MediaBrowser.Api/Playback/Progressive/VideoService.cs
index 826b034408..b16761595c 100644
--- a/MediaBrowser.Api/Playback/Progressive/VideoService.cs
+++ b/MediaBrowser.Api/Playback/Progressive/VideoService.cs
@@ -156,9 +156,10 @@ namespace MediaBrowser.Api.Playback.Progressive
}
}
- if (request.Framerate.HasValue)
+ var framerate = GetFramerateParam(state);
+ if (framerate.HasValue)
{
- args += string.Format(" -r {0}", request.Framerate.Value);
+ args += string.Format(" -r {0}", framerate.Value.ToString(UsCulture));
}
var qualityParam = GetVideoQualityParam(state, codec);
@@ -169,11 +170,13 @@ namespace MediaBrowser.Api.Playback.Progressive
{
if (string.Equals(codec, "libvpx", StringComparison.OrdinalIgnoreCase))
{
- qualityParam += string.Format(" -minrate:v ({0}*.90) -maxrate:v ({0}*1.10) -bufsize:v {0} -b:v {0}", bitrate.Value.ToString(UsCulture));
+ qualityParam += string.Format(" -b:v {0}", bitrate.Value.ToString(UsCulture));
}
else
{
- qualityParam += string.Format(" -b:v {0}", bitrate.Value.ToString(UsCulture));
+ qualityParam += string.Format(" -maxrate {0} -bufsize {1}",
+ bitrate.Value.ToString(UsCulture),
+ (bitrate.Value * 2).ToString(UsCulture));
}
}
@@ -182,7 +185,10 @@ namespace MediaBrowser.Api.Playback.Progressive
args += " " + qualityParam.Trim();
}
- args += " -vsync vfr";
+ if (!string.IsNullOrEmpty(state.VideoSync))
+ {
+ args += " -vsync " + state.VideoSync;
+ }
if (!string.IsNullOrEmpty(state.VideoRequest.Profile))
{
diff --git a/MediaBrowser.Api/Playback/StreamState.cs b/MediaBrowser.Api/Playback/StreamState.cs
index 84cc8ecd36..55d7b22e2c 100644
--- a/MediaBrowser.Api/Playback/StreamState.cs
+++ b/MediaBrowser.Api/Playback/StreamState.cs
@@ -59,7 +59,8 @@ namespace MediaBrowser.Api.Playback
public long? RunTimeTicks;
- public int AudioSync = 1;
+ public string AudioSync = "1";
+ public string VideoSync = "vfr";
public bool DeInterlace { get; set; }