|
|
@ -18,6 +18,7 @@ using System.Linq;
|
|
|
|
using System.Text;
|
|
|
|
using System.Text;
|
|
|
|
using System.Threading;
|
|
|
|
using System.Threading;
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
|
|
|
using MediaBrowser.Model.Configuration;
|
|
|
|
using MediaBrowser.Model.Services;
|
|
|
|
using MediaBrowser.Model.Services;
|
|
|
|
using MimeTypes = MediaBrowser.Model.Net.MimeTypes;
|
|
|
|
using MimeTypes = MediaBrowser.Model.Net.MimeTypes;
|
|
|
|
|
|
|
|
|
|
|
@ -777,7 +778,7 @@ namespace MediaBrowser.Api.Playback.Hls
|
|
|
|
return ResultFactory.GetResult(playlistText, MimeTypes.GetMimeType("playlist.m3u8"), new Dictionary<string, string>());
|
|
|
|
return ResultFactory.GetResult(playlistText, MimeTypes.GetMimeType("playlist.m3u8"), new Dictionary<string, string>());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
protected override string GetAudioArguments(StreamState state)
|
|
|
|
protected override string GetAudioArguments(StreamState state, EncodingOptions encodingOptions)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
var audioCodec = EncodingHelper.GetAudioEncoder(state);
|
|
|
|
var audioCodec = EncodingHelper.GetAudioEncoder(state);
|
|
|
|
|
|
|
|
|
|
|
@ -813,7 +814,7 @@ namespace MediaBrowser.Api.Playback.Hls
|
|
|
|
|
|
|
|
|
|
|
|
if (string.Equals(audioCodec, "copy", StringComparison.OrdinalIgnoreCase))
|
|
|
|
if (string.Equals(audioCodec, "copy", StringComparison.OrdinalIgnoreCase))
|
|
|
|
{
|
|
|
|
{
|
|
|
|
var videoCodec = EncodingHelper.GetVideoEncoder(state, ApiEntryPoint.Instance.GetEncodingOptions());
|
|
|
|
var videoCodec = EncodingHelper.GetVideoEncoder(state, encodingOptions);
|
|
|
|
|
|
|
|
|
|
|
|
if (string.Equals(videoCodec, "copy", StringComparison.OrdinalIgnoreCase) && state.EnableBreakOnNonKeyFrames(videoCodec))
|
|
|
|
if (string.Equals(videoCodec, "copy", StringComparison.OrdinalIgnoreCase) && state.EnableBreakOnNonKeyFrames(videoCodec))
|
|
|
|
{
|
|
|
|
{
|
|
|
@ -844,19 +845,19 @@ namespace MediaBrowser.Api.Playback.Hls
|
|
|
|
args += " -ar " + state.OutputAudioSampleRate.Value.ToString(UsCulture);
|
|
|
|
args += " -ar " + state.OutputAudioSampleRate.Value.ToString(UsCulture);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
args += " " + EncodingHelper.GetAudioFilterParam(state, ApiEntryPoint.Instance.GetEncodingOptions(), true);
|
|
|
|
args += " " + EncodingHelper.GetAudioFilterParam(state, encodingOptions, true);
|
|
|
|
|
|
|
|
|
|
|
|
return args;
|
|
|
|
return args;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
protected override string GetVideoArguments(StreamState state)
|
|
|
|
protected override string GetVideoArguments(StreamState state, EncodingOptions encodingOptions)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (!state.IsOutputVideo)
|
|
|
|
if (!state.IsOutputVideo)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
return string.Empty;
|
|
|
|
return string.Empty;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
var codec = EncodingHelper.GetVideoEncoder(state, ApiEntryPoint.Instance.GetEncodingOptions());
|
|
|
|
var codec = EncodingHelper.GetVideoEncoder(state, encodingOptions);
|
|
|
|
|
|
|
|
|
|
|
|
var args = "-codec:v:0 " + codec;
|
|
|
|
var args = "-codec:v:0 " + codec;
|
|
|
|
|
|
|
|
|
|
|
@ -882,8 +883,6 @@ namespace MediaBrowser.Api.Playback.Hls
|
|
|
|
|
|
|
|
|
|
|
|
var hasGraphicalSubs = state.SubtitleStream != null && !state.SubtitleStream.IsTextSubtitleStream && state.SubtitleDeliveryMethod == SubtitleDeliveryMethod.Encode;
|
|
|
|
var hasGraphicalSubs = state.SubtitleStream != null && !state.SubtitleStream.IsTextSubtitleStream && state.SubtitleDeliveryMethod == SubtitleDeliveryMethod.Encode;
|
|
|
|
|
|
|
|
|
|
|
|
var encodingOptions = ApiEntryPoint.Instance.GetEncodingOptions();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
args += " " + EncodingHelper.GetVideoQualityParam(state, codec, encodingOptions, GetDefaultH264Preset()) + keyFrameArg;
|
|
|
|
args += " " + EncodingHelper.GetVideoQualityParam(state, codec, encodingOptions, GetDefaultH264Preset()) + keyFrameArg;
|
|
|
|
|
|
|
|
|
|
|
|
//args += " -mixed-refs 0 -refs 3 -x264opts b_pyramid=0:weightb=0:weightp=0";
|
|
|
|
//args += " -mixed-refs 0 -refs 3 -x264opts b_pyramid=0:weightb=0:weightp=0";
|
|
|
@ -918,9 +917,8 @@ namespace MediaBrowser.Api.Playback.Hls
|
|
|
|
return args;
|
|
|
|
return args;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
protected override string GetCommandLineArguments(string outputPath, StreamState state, bool isEncoding)
|
|
|
|
protected override string GetCommandLineArguments(string outputPath, EncodingOptions encodingOptions, StreamState state, bool isEncoding)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
var encodingOptions = ApiEntryPoint.Instance.GetEncodingOptions();
|
|
|
|
|
|
|
|
var threads = EncodingHelper.GetNumberOfThreads(state, encodingOptions, false);
|
|
|
|
var threads = EncodingHelper.GetNumberOfThreads(state, encodingOptions, false);
|
|
|
|
|
|
|
|
|
|
|
|
var inputModifier = EncodingHelper.GetInputModifier(state, encodingOptions);
|
|
|
|
var inputModifier = EncodingHelper.GetInputModifier(state, encodingOptions);
|
|
|
@ -947,7 +945,7 @@ namespace MediaBrowser.Api.Playback.Hls
|
|
|
|
segmentFormat = "mpegts";
|
|
|
|
segmentFormat = "mpegts";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
var videoCodec = EncodingHelper.GetVideoEncoder(state, ApiEntryPoint.Instance.GetEncodingOptions());
|
|
|
|
var videoCodec = EncodingHelper.GetVideoEncoder(state, encodingOptions);
|
|
|
|
var breakOnNonKeyFrames = state.EnableBreakOnNonKeyFrames(videoCodec);
|
|
|
|
var breakOnNonKeyFrames = state.EnableBreakOnNonKeyFrames(videoCodec);
|
|
|
|
|
|
|
|
|
|
|
|
var breakOnNonKeyFramesArg = breakOnNonKeyFrames ? " -break_non_keyframes 1" : "";
|
|
|
|
var breakOnNonKeyFramesArg = breakOnNonKeyFrames ? " -break_non_keyframes 1" : "";
|
|
|
@ -957,8 +955,8 @@ namespace MediaBrowser.Api.Playback.Hls
|
|
|
|
EncodingHelper.GetInputArgument(state, encodingOptions),
|
|
|
|
EncodingHelper.GetInputArgument(state, encodingOptions),
|
|
|
|
threads,
|
|
|
|
threads,
|
|
|
|
mapArgs,
|
|
|
|
mapArgs,
|
|
|
|
GetVideoArguments(state),
|
|
|
|
GetVideoArguments(state, encodingOptions),
|
|
|
|
GetAudioArguments(state),
|
|
|
|
GetAudioArguments(state, encodingOptions),
|
|
|
|
state.SegmentLength.ToString(UsCulture),
|
|
|
|
state.SegmentLength.ToString(UsCulture),
|
|
|
|
startNumberParam,
|
|
|
|
startNumberParam,
|
|
|
|
outputPath,
|
|
|
|
outputPath,
|
|
|
|