Merge branch 'master' of https://github.com/MediaBrowser/MediaBrowser
This commit is contained in:
commit
7eabf7e015
|
@ -178,9 +178,7 @@ namespace MediaBrowser.Api.Playback.Hls
|
||||||
|
|
||||||
var probeSize = Kernel.Instance.FFMpegManager.GetProbeSizeArgument(state.Item);
|
var probeSize = Kernel.Instance.FFMpegManager.GetProbeSizeArgument(state.Item);
|
||||||
|
|
||||||
const string keyFrameArg = " -force_key_frames expr:if(isnan(prev_forced_t),gte(t,0),gte(t,prev_forced_t+5))";
|
return string.Format("{0} {1} -i {2}{3} -threads 0 {4} {5} {6} -f ssegment -segment_list_flags +live -segment_time 10 -segment_list \"{7}\" \"{8}\"",
|
||||||
|
|
||||||
return string.Format("{0} {1} -i {2}{3} -threads 0 {4} {5} {6}{7} -f ssegment -segment_list_flags +live -segment_time 10 -segment_list \"{8}\" \"{9}\"",
|
|
||||||
probeSize,
|
probeSize,
|
||||||
GetFastSeekCommandLineParameter(state.Request),
|
GetFastSeekCommandLineParameter(state.Request),
|
||||||
GetInputArgument(state.Item, state.IsoMount),
|
GetInputArgument(state.Item, state.IsoMount),
|
||||||
|
@ -188,7 +186,6 @@ namespace MediaBrowser.Api.Playback.Hls
|
||||||
GetMapArgs(state),
|
GetMapArgs(state),
|
||||||
GetVideoArguments(state),
|
GetVideoArguments(state),
|
||||||
GetAudioArguments(state),
|
GetAudioArguments(state),
|
||||||
keyFrameArg,
|
|
||||||
outputPath,
|
outputPath,
|
||||||
segmentOutputPath
|
segmentOutputPath
|
||||||
).Trim();
|
).Trim();
|
||||||
|
|
|
@ -8,14 +8,14 @@ using ServiceStack.ServiceHost;
|
||||||
namespace MediaBrowser.Api.Playback.Hls
|
namespace MediaBrowser.Api.Playback.Hls
|
||||||
{
|
{
|
||||||
[Route("/Videos/{Id}/stream.m3u8", "GET")]
|
[Route("/Videos/{Id}/stream.m3u8", "GET")]
|
||||||
[ServiceStack.ServiceHost.Api(Description = "Gets a video stream using HTTP live streaming.")]
|
[Api(Description = "Gets a video stream using HTTP live streaming.")]
|
||||||
public class GetHlsVideoStream : VideoStreamRequest
|
public class GetHlsVideoStream : VideoStreamRequest
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[Route("/Videos/{Id}/segments/{SegmentId}/stream.ts", "GET")]
|
[Route("/Videos/{Id}/segments/{SegmentId}/stream.ts", "GET")]
|
||||||
[ServiceStack.ServiceHost.Api(Description = "Gets an Http live streaming segment file. Internal use only.")]
|
[Api(Description = "Gets an Http live streaming segment file. Internal use only.")]
|
||||||
public class GetHlsVideoSegment
|
public class GetHlsVideoSegment
|
||||||
{
|
{
|
||||||
public string Id { get; set; }
|
public string Id { get; set; }
|
||||||
|
@ -115,7 +115,9 @@ namespace MediaBrowser.Api.Playback.Hls
|
||||||
return IsH264(state.VideoStream) ? "-codec:v:0 copy -bsf h264_mp4toannexb" : "-codec:v:0 copy";
|
return IsH264(state.VideoStream) ? "-codec:v:0 copy -bsf h264_mp4toannexb" : "-codec:v:0 copy";
|
||||||
}
|
}
|
||||||
|
|
||||||
var args = "-codec:v:0 " + codec + " -preset superfast";
|
const string keyFrameArg = " -force_key_frames expr:if(isnan(prev_forced_t),gte(t,0),gte(t,prev_forced_t+5))";
|
||||||
|
|
||||||
|
var args = "-codec:v:0 " + codec + " -preset superfast" + keyFrameArg;
|
||||||
|
|
||||||
if (state.VideoRequest.VideoBitRate.HasValue)
|
if (state.VideoRequest.VideoBitRate.HasValue)
|
||||||
{
|
{
|
||||||
|
@ -154,6 +156,16 @@ namespace MediaBrowser.Api.Playback.Hls
|
||||||
|
|
||||||
args += " -vsync vfr";
|
args += " -vsync vfr";
|
||||||
|
|
||||||
|
if (!string.IsNullOrEmpty(state.VideoRequest.Profile))
|
||||||
|
{
|
||||||
|
args += " -profile:v" + state.VideoRequest.Profile;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!string.IsNullOrEmpty(state.VideoRequest.Level))
|
||||||
|
{
|
||||||
|
args += " -level 3" + state.VideoRequest.Level;
|
||||||
|
}
|
||||||
|
|
||||||
if (state.SubtitleStream != null)
|
if (state.SubtitleStream != null)
|
||||||
{
|
{
|
||||||
// This is for internal graphical subs
|
// This is for internal graphical subs
|
||||||
|
|
|
@ -81,17 +81,6 @@ namespace MediaBrowser.Api.Playback.Progressive
|
||||||
// Get the output codec name
|
// Get the output codec name
|
||||||
var videoCodec = GetVideoCodec(state.VideoRequest);
|
var videoCodec = GetVideoCodec(state.VideoRequest);
|
||||||
|
|
||||||
var graphicalSubtitleParam = string.Empty;
|
|
||||||
|
|
||||||
if (state.SubtitleStream != null)
|
|
||||||
{
|
|
||||||
// This is for internal graphical subs
|
|
||||||
if (!state.SubtitleStream.IsExternal && (state.SubtitleStream.Codec.IndexOf("pgs", StringComparison.OrdinalIgnoreCase) != -1 || state.SubtitleStream.Codec.IndexOf("dvd", StringComparison.OrdinalIgnoreCase) != -1))
|
|
||||||
{
|
|
||||||
graphicalSubtitleParam = GetInternalGraphicalSubtitleParam(state, videoCodec);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var format = string.Empty;
|
var format = string.Empty;
|
||||||
var keyFrame = string.Empty;
|
var keyFrame = string.Empty;
|
||||||
|
|
||||||
|
@ -106,7 +95,7 @@ namespace MediaBrowser.Api.Playback.Progressive
|
||||||
keyFrame = " -g " + Math.Round(framerate);
|
keyFrame = " -g " + Math.Round(framerate);
|
||||||
}
|
}
|
||||||
|
|
||||||
return string.Format("{0} {1} -i {2}{3}{4} -threads 0 {5} {6}{7} {8}{9} \"{10}\"",
|
return string.Format("{0} {1} -i {2}{3}{4} -threads 0 {5} {6} {7}{8} \"{9}\"",
|
||||||
probeSize,
|
probeSize,
|
||||||
GetFastSeekCommandLineParameter(state.Request),
|
GetFastSeekCommandLineParameter(state.Request),
|
||||||
GetInputArgument(video, state.IsoMount),
|
GetInputArgument(video, state.IsoMount),
|
||||||
|
@ -114,7 +103,6 @@ namespace MediaBrowser.Api.Playback.Progressive
|
||||||
keyFrame,
|
keyFrame,
|
||||||
GetMapArgs(state),
|
GetMapArgs(state),
|
||||||
GetVideoArguments(state, videoCodec),
|
GetVideoArguments(state, videoCodec),
|
||||||
graphicalSubtitleParam,
|
|
||||||
GetAudioArguments(state),
|
GetAudioArguments(state),
|
||||||
format,
|
format,
|
||||||
outputPath
|
outputPath
|
||||||
|
@ -125,42 +113,62 @@ namespace MediaBrowser.Api.Playback.Progressive
|
||||||
/// Gets video arguments to pass to ffmpeg
|
/// Gets video arguments to pass to ffmpeg
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="state">The state.</param>
|
/// <param name="state">The state.</param>
|
||||||
/// <param name="videoCodec">The video codec.</param>
|
/// <param name="codec">The video codec.</param>
|
||||||
/// <returns>System.String.</returns>
|
/// <returns>System.String.</returns>
|
||||||
private string GetVideoArguments(StreamState state, string videoCodec)
|
private string GetVideoArguments(StreamState state, string codec)
|
||||||
{
|
{
|
||||||
var args = "-vcodec " + videoCodec;
|
var args = "-vcodec " + codec;
|
||||||
|
|
||||||
|
// See if we can save come cpu cycles by avoiding encoding
|
||||||
|
if (codec.Equals("copy", StringComparison.OrdinalIgnoreCase))
|
||||||
|
{
|
||||||
|
return IsH264(state.VideoStream) ? args + " -bsf h264_mp4toannexb" : args;
|
||||||
|
}
|
||||||
|
|
||||||
|
const string keyFrameArg = " -force_key_frames expr:if(isnan(prev_forced_t),gte(t,0),gte(t,prev_forced_t+2))";
|
||||||
|
|
||||||
|
args += keyFrameArg;
|
||||||
|
|
||||||
var request = state.VideoRequest;
|
var request = state.VideoRequest;
|
||||||
|
|
||||||
// If we're encoding video, add additional params
|
// Add resolution params, if specified
|
||||||
if (!videoCodec.Equals("copy", StringComparison.OrdinalIgnoreCase))
|
if (request.Width.HasValue || request.Height.HasValue || request.MaxHeight.HasValue || request.MaxWidth.HasValue)
|
||||||
{
|
{
|
||||||
// Add resolution params, if specified
|
args += GetOutputSizeParam(state, codec);
|
||||||
if (request.Width.HasValue || request.Height.HasValue || request.MaxHeight.HasValue || request.MaxWidth.HasValue)
|
|
||||||
{
|
|
||||||
args += GetOutputSizeParam(state, videoCodec);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (request.Framerate.HasValue)
|
|
||||||
{
|
|
||||||
args += string.Format(" -r {0}", request.Framerate.Value);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add the audio bitrate
|
|
||||||
var qualityParam = GetVideoQualityParam(request, videoCodec);
|
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(qualityParam))
|
|
||||||
{
|
|
||||||
args += " " + qualityParam;
|
|
||||||
}
|
|
||||||
|
|
||||||
args += " -vsync vfr";
|
|
||||||
}
|
}
|
||||||
else if (IsH264(state.VideoStream))
|
|
||||||
|
if (request.Framerate.HasValue)
|
||||||
{
|
{
|
||||||
// FFmpeg will fail to convert and give h264 bitstream malformated error if it isn't used when converting mp4 to transport stream.
|
args += string.Format(" -r {0}", request.Framerate.Value);
|
||||||
args += " -bsf h264_mp4toannexb";
|
}
|
||||||
|
|
||||||
|
// Add the audio bitrate
|
||||||
|
var qualityParam = GetVideoQualityParam(request, codec);
|
||||||
|
|
||||||
|
if (!string.IsNullOrEmpty(qualityParam))
|
||||||
|
{
|
||||||
|
args += " " + qualityParam;
|
||||||
|
}
|
||||||
|
|
||||||
|
args += " -vsync vfr";
|
||||||
|
|
||||||
|
if (!string.IsNullOrEmpty(state.VideoRequest.Profile))
|
||||||
|
{
|
||||||
|
args += " -profile:v" + state.VideoRequest.Profile;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!string.IsNullOrEmpty(state.VideoRequest.Level))
|
||||||
|
{
|
||||||
|
args += " -level 3" + state.VideoRequest.Level;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (state.SubtitleStream != null)
|
||||||
|
{
|
||||||
|
// This is for internal graphical subs
|
||||||
|
if (!state.SubtitleStream.IsExternal && (state.SubtitleStream.Codec.IndexOf("pgs", StringComparison.OrdinalIgnoreCase) != -1 || state.SubtitleStream.Codec.IndexOf("dvd", StringComparison.OrdinalIgnoreCase) != -1))
|
||||||
|
{
|
||||||
|
args += GetInternalGraphicalSubtitleParam(state, codec);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return args;
|
return args;
|
||||||
|
|
|
@ -135,5 +135,19 @@ namespace MediaBrowser.Api.Playback
|
||||||
/// <value>The framerate.</value>
|
/// <value>The framerate.</value>
|
||||||
[ApiMember(Name = "Framerate", Description = "Optional. A specific video framerate to encode to, e.g. 23.976. Generally this should be omitted unless the device has specific requirements.", IsRequired = false, DataType = "double", ParameterType = "query", Verb = "GET")]
|
[ApiMember(Name = "Framerate", Description = "Optional. A specific video framerate to encode to, e.g. 23.976. Generally this should be omitted unless the device has specific requirements.", IsRequired = false, DataType = "double", ParameterType = "query", Verb = "GET")]
|
||||||
public double? Framerate { get; set; }
|
public double? Framerate { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the profile.
|
||||||
|
/// </summary>
|
||||||
|
/// <value>The profile.</value>
|
||||||
|
[ApiMember(Name = "Profile", Description = "Optional. Specify a specific h264 profile, e.g. main, baseline, high.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
|
||||||
|
public string Profile { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the level.
|
||||||
|
/// </summary>
|
||||||
|
/// <value>The level.</value>
|
||||||
|
[ApiMember(Name = "Level", Description = "Optional. Specify a level for the h264 profile, e.g. 3, 3.1.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
|
||||||
|
public string Level { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -88,13 +88,13 @@ namespace MediaBrowser.ServerApplication.EntryPoints
|
||||||
|
|
||||||
void _taskManager_TaskCompleted(object sender, GenericEventArgs<TaskResult> e)
|
void _taskManager_TaskCompleted(object sender, GenericEventArgs<TaskResult> e)
|
||||||
{
|
{
|
||||||
_serverManager.SendWebSocketMessage("ScheduledTaskEndExecute", e.Argument);
|
_serverManager.SendWebSocketMessage("ScheduledTaskEnded", e.Argument);
|
||||||
}
|
}
|
||||||
|
|
||||||
void _taskManager_TaskExecuting(object sender, EventArgs e)
|
void _taskManager_TaskExecuting(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
var task = (IScheduledTask) sender;
|
var task = (IScheduledTask) sender;
|
||||||
_serverManager.SendWebSocketMessage("ScheduledTaskBeginExecute", task.Name);
|
_serverManager.SendWebSocketMessage("ScheduledTaskStarted", task.Name);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -164,7 +164,7 @@ namespace MediaBrowser.ServerApplication.EntryPoints
|
||||||
/// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param>
|
/// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param>
|
||||||
void kernel_HasPendingRestartChanged(object sender, EventArgs e)
|
void kernel_HasPendingRestartChanged(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
_serverManager.SendWebSocketMessage("HasPendingRestartChanged", _appHost.GetSystemInfo());
|
_serverManager.SendWebSocketMessage("RestartRequired", _appHost.GetSystemInfo());
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
|
<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
|
||||||
<metadata>
|
<metadata>
|
||||||
<id>MediaBrowser.Common.Internal</id>
|
<id>MediaBrowser.Common.Internal</id>
|
||||||
<version>3.0.61</version>
|
<version>3.0.62</version>
|
||||||
<title>MediaBrowser.Common.Internal</title>
|
<title>MediaBrowser.Common.Internal</title>
|
||||||
<authors>Luke</authors>
|
<authors>Luke</authors>
|
||||||
<owners>ebr,Luke,scottisafool</owners>
|
<owners>ebr,Luke,scottisafool</owners>
|
||||||
|
@ -12,7 +12,7 @@
|
||||||
<description>Contains common components shared by Media Browser Theatre and Media Browser Server. Not intended for plugin developer consumption.</description>
|
<description>Contains common components shared by Media Browser Theatre and Media Browser Server. Not intended for plugin developer consumption.</description>
|
||||||
<copyright>Copyright © Media Browser 2013</copyright>
|
<copyright>Copyright © Media Browser 2013</copyright>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<dependency id="MediaBrowser.Common" version="3.0.61" />
|
<dependency id="MediaBrowser.Common" version="3.0.62" />
|
||||||
<dependency id="NLog" version="2.0.0.2000" />
|
<dependency id="NLog" version="2.0.0.2000" />
|
||||||
<dependency id="ServiceStack.Text" version="3.9.38" />
|
<dependency id="ServiceStack.Text" version="3.9.38" />
|
||||||
<dependency id="protobuf-net" version="2.0.0.621" />
|
<dependency id="protobuf-net" version="2.0.0.621" />
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
|
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
|
||||||
<metadata>
|
<metadata>
|
||||||
<id>MediaBrowser.Common</id>
|
<id>MediaBrowser.Common</id>
|
||||||
<version>3.0.61</version>
|
<version>3.0.62</version>
|
||||||
<title>MediaBrowser.Common</title>
|
<title>MediaBrowser.Common</title>
|
||||||
<authors>Media Browser Team</authors>
|
<authors>Media Browser Team</authors>
|
||||||
<owners>ebr,Luke,scottisafool</owners>
|
<owners>ebr,Luke,scottisafool</owners>
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
|
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
|
||||||
<metadata>
|
<metadata>
|
||||||
<id>MediaBrowser.Server.Core</id>
|
<id>MediaBrowser.Server.Core</id>
|
||||||
<version>3.0.61</version>
|
<version>3.0.62</version>
|
||||||
<title>Media Browser.Server.Core</title>
|
<title>Media Browser.Server.Core</title>
|
||||||
<authors>Media Browser Team</authors>
|
<authors>Media Browser Team</authors>
|
||||||
<owners>ebr,Luke,scottisafool</owners>
|
<owners>ebr,Luke,scottisafool</owners>
|
||||||
|
@ -12,7 +12,7 @@
|
||||||
<description>Contains core components required to build plugins for Media Browser Server.</description>
|
<description>Contains core components required to build plugins for Media Browser Server.</description>
|
||||||
<copyright>Copyright © Media Browser 2013</copyright>
|
<copyright>Copyright © Media Browser 2013</copyright>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<dependency id="MediaBrowser.Common" version="3.0.61" />
|
<dependency id="MediaBrowser.Common" version="3.0.62" />
|
||||||
</dependencies>
|
</dependencies>
|
||||||
</metadata>
|
</metadata>
|
||||||
<files>
|
<files>
|
||||||
|
|
Loading…
Reference in New Issue
Block a user