Merge pull request #8744 from DomiStyle/segment-deletion
This commit is contained in:
commit
4972fbf2a3
|
@ -1641,9 +1641,11 @@ public class DynamicHlsController : BaseJellyfinApiController
|
|||
Path.GetFileNameWithoutExtension(outputPath));
|
||||
}
|
||||
|
||||
var hlsArguments = GetHlsArguments(isEventPlaylist, state.SegmentLength);
|
||||
|
||||
return string.Format(
|
||||
CultureInfo.InvariantCulture,
|
||||
"{0} {1} -map_metadata -1 -map_chapters -1 -threads {2} {3} {4} {5} -copyts -avoid_negative_ts disabled -max_muxing_queue_size {6} -f hls -max_delay 5000000 -hls_time {7} -hls_segment_type {8} -start_number {9}{10} -hls_segment_filename \"{12}\" -hls_playlist_type {11} -hls_list_size 0 -y \"{13}\"",
|
||||
"{0} {1} -map_metadata -1 -map_chapters -1 -threads {2} {3} {4} {5} -copyts -avoid_negative_ts disabled -max_muxing_queue_size {6} -f hls -max_delay 5000000 -hls_time {7} -hls_segment_type {8} -start_number {9}{10} -hls_segment_filename \"{11}\" {12} -y \"{13}\"",
|
||||
inputModifier,
|
||||
_encodingHelper.GetInputArgument(state, _encodingOptions, segmentContainer),
|
||||
threads,
|
||||
|
@ -1655,11 +1657,38 @@ public class DynamicHlsController : BaseJellyfinApiController
|
|||
segmentFormat,
|
||||
startNumber.ToString(CultureInfo.InvariantCulture),
|
||||
baseUrlParam,
|
||||
isEventPlaylist ? "event" : "vod",
|
||||
EncodingUtils.NormalizePath(outputTsArg),
|
||||
hlsArguments,
|
||||
EncodingUtils.NormalizePath(outputPath)).Trim();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the HLS arguments for transcoding.
|
||||
/// </summary>
|
||||
/// <returns>The command line arguments for HLS transcoding.</returns>
|
||||
private string GetHlsArguments(bool isEventPlaylist, int segmentLength)
|
||||
{
|
||||
var enableThrottling = _encodingOptions.EnableThrottling;
|
||||
var enableSegmentDeletion = _encodingOptions.EnableSegmentDeletion;
|
||||
|
||||
// Only enable segment deletion when throttling is enabled
|
||||
if (enableThrottling && enableSegmentDeletion)
|
||||
{
|
||||
// Store enough segments for configured seconds of playback; this needs to be above throttling settings
|
||||
var segmentCount = _encodingOptions.SegmentKeepSeconds / segmentLength;
|
||||
|
||||
_logger.LogDebug("Using throttling and segment deletion, keeping {0} segments", segmentCount);
|
||||
|
||||
return string.Format(CultureInfo.InvariantCulture, "-hls_list_size {0} -hls_flags delete_segments", segmentCount.ToString(CultureInfo.InvariantCulture));
|
||||
}
|
||||
else
|
||||
{
|
||||
_logger.LogDebug("Using normal playback, is event playlist? {0}", isEventPlaylist);
|
||||
|
||||
return string.Format(CultureInfo.InvariantCulture, "-hls_playlist_type {0} -hls_list_size 0", isEventPlaylist ? "event" : "vod");
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the audio arguments for transcoding.
|
||||
/// </summary>
|
||||
|
|
|
@ -660,7 +660,7 @@ public class TranscodingJobHelper : IDisposable
|
|||
{
|
||||
if (EnableThrottling(state))
|
||||
{
|
||||
transcodingJob.TranscodingThrottler = new TranscodingThrottler(transcodingJob, new Logger<TranscodingThrottler>(new LoggerFactory()), _serverConfigurationManager, _fileSystem, _mediaEncoder);
|
||||
transcodingJob.TranscodingThrottler = new TranscodingThrottler(transcodingJob, _loggerFactory.CreateLogger<TranscodingThrottler>(), _serverConfigurationManager, _fileSystem, _mediaEncoder);
|
||||
transcodingJob.TranscodingThrottler.Start();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1365,22 +1365,11 @@ namespace MediaBrowser.Controller.MediaEncoding
|
|||
{
|
||||
var args = string.Empty;
|
||||
var gopArg = string.Empty;
|
||||
var keyFrameArg = string.Empty;
|
||||
if (isEventPlaylist)
|
||||
{
|
||||
keyFrameArg = string.Format(
|
||||
CultureInfo.InvariantCulture,
|
||||
" -force_key_frames:0 \"expr:gte(t,n_forced*{0})\"",
|
||||
segmentLength);
|
||||
}
|
||||
else if (startNumber.HasValue)
|
||||
{
|
||||
keyFrameArg = string.Format(
|
||||
CultureInfo.InvariantCulture,
|
||||
" -force_key_frames:0 \"expr:gte(t,{0}+n_forced*{1})\"",
|
||||
startNumber.Value * segmentLength,
|
||||
segmentLength);
|
||||
}
|
||||
|
||||
var keyFrameArg = string.Format(
|
||||
CultureInfo.InvariantCulture,
|
||||
" -force_key_frames:0 \"expr:gte(t,n_forced*{0})\"",
|
||||
segmentLength);
|
||||
|
||||
var framerate = state.VideoStream?.RealFrameRate;
|
||||
if (framerate.HasValue)
|
||||
|
|
|
@ -20,6 +20,8 @@ public class EncodingOptions
|
|||
MaxMuxingQueueSize = 2048;
|
||||
EnableThrottling = false;
|
||||
ThrottleDelaySeconds = 180;
|
||||
EnableSegmentDeletion = false;
|
||||
SegmentKeepSeconds = 720;
|
||||
EncodingThreadCount = -1;
|
||||
// This is a DRM device that is almost guaranteed to be there on every intel platform,
|
||||
// plus it's the default one in ffmpeg if you don't specify anything
|
||||
|
@ -102,6 +104,16 @@ public class EncodingOptions
|
|||
/// </summary>
|
||||
public int ThrottleDelaySeconds { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets a value indicating whether segment deletion is enabled.
|
||||
/// </summary>
|
||||
public bool EnableSegmentDeletion { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets seconds for which segments should be kept before being deleted.
|
||||
/// </summary>
|
||||
public int SegmentKeepSeconds { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the hardware acceleration type.
|
||||
/// </summary>
|
||||
|
|
Loading…
Reference in New Issue
Block a user