mirror of
https://github.com/jellyfin/jellyfin.git
synced 2026-01-23 23:20:51 +01:00
Merge pull request #15926 from abitofevrything/feat/accurate_hls_seeking
Refactor HLS transcode seeking
This commit is contained in:
parent
b9abf590c5
commit
8d052a6cb1
31 changed files with 61 additions and 188 deletions
|
|
@ -50,7 +50,6 @@ public class AudioController : BaseJellyfinApiController
|
||||||
/// <param name="enableAutoStreamCopy">Whether or not to allow automatic stream copy if requested values match the original source. Defaults to true.</param>
|
/// <param name="enableAutoStreamCopy">Whether or not to allow automatic stream copy if requested values match the original source. Defaults to true.</param>
|
||||||
/// <param name="allowVideoStreamCopy">Whether or not to allow copying of the video stream url.</param>
|
/// <param name="allowVideoStreamCopy">Whether or not to allow copying of the video stream url.</param>
|
||||||
/// <param name="allowAudioStreamCopy">Whether or not to allow copying of the audio stream url.</param>
|
/// <param name="allowAudioStreamCopy">Whether or not to allow copying of the audio stream url.</param>
|
||||||
/// <param name="breakOnNonKeyFrames">Optional. Whether to break on non key frames.</param>
|
|
||||||
/// <param name="audioSampleRate">Optional. Specify a specific audio sample rate, e.g. 44100.</param>
|
/// <param name="audioSampleRate">Optional. Specify a specific audio sample rate, e.g. 44100.</param>
|
||||||
/// <param name="maxAudioBitDepth">Optional. The maximum audio bit depth.</param>
|
/// <param name="maxAudioBitDepth">Optional. The maximum audio bit depth.</param>
|
||||||
/// <param name="audioBitRate">Optional. Specify an audio bitrate to encode to, e.g. 128000. If omitted this will be left to encoder defaults.</param>
|
/// <param name="audioBitRate">Optional. Specify an audio bitrate to encode to, e.g. 128000. If omitted this will be left to encoder defaults.</param>
|
||||||
|
|
@ -107,7 +106,6 @@ public class AudioController : BaseJellyfinApiController
|
||||||
[FromQuery] bool? enableAutoStreamCopy,
|
[FromQuery] bool? enableAutoStreamCopy,
|
||||||
[FromQuery] bool? allowVideoStreamCopy,
|
[FromQuery] bool? allowVideoStreamCopy,
|
||||||
[FromQuery] bool? allowAudioStreamCopy,
|
[FromQuery] bool? allowAudioStreamCopy,
|
||||||
[FromQuery] bool? breakOnNonKeyFrames,
|
|
||||||
[FromQuery] int? audioSampleRate,
|
[FromQuery] int? audioSampleRate,
|
||||||
[FromQuery] int? maxAudioBitDepth,
|
[FromQuery] int? maxAudioBitDepth,
|
||||||
[FromQuery] int? audioBitRate,
|
[FromQuery] int? audioBitRate,
|
||||||
|
|
@ -159,7 +157,6 @@ public class AudioController : BaseJellyfinApiController
|
||||||
EnableAutoStreamCopy = enableAutoStreamCopy ?? true,
|
EnableAutoStreamCopy = enableAutoStreamCopy ?? true,
|
||||||
AllowAudioStreamCopy = allowAudioStreamCopy ?? true,
|
AllowAudioStreamCopy = allowAudioStreamCopy ?? true,
|
||||||
AllowVideoStreamCopy = allowVideoStreamCopy ?? true,
|
AllowVideoStreamCopy = allowVideoStreamCopy ?? true,
|
||||||
BreakOnNonKeyFrames = breakOnNonKeyFrames ?? false,
|
|
||||||
AudioSampleRate = audioSampleRate,
|
AudioSampleRate = audioSampleRate,
|
||||||
MaxAudioChannels = maxAudioChannels,
|
MaxAudioChannels = maxAudioChannels,
|
||||||
AudioBitRate = audioBitRate,
|
AudioBitRate = audioBitRate,
|
||||||
|
|
@ -217,7 +214,6 @@ public class AudioController : BaseJellyfinApiController
|
||||||
/// <param name="enableAutoStreamCopy">Whether or not to allow automatic stream copy if requested values match the original source. Defaults to true.</param>
|
/// <param name="enableAutoStreamCopy">Whether or not to allow automatic stream copy if requested values match the original source. Defaults to true.</param>
|
||||||
/// <param name="allowVideoStreamCopy">Whether or not to allow copying of the video stream url.</param>
|
/// <param name="allowVideoStreamCopy">Whether or not to allow copying of the video stream url.</param>
|
||||||
/// <param name="allowAudioStreamCopy">Whether or not to allow copying of the audio stream url.</param>
|
/// <param name="allowAudioStreamCopy">Whether or not to allow copying of the audio stream url.</param>
|
||||||
/// <param name="breakOnNonKeyFrames">Optional. Whether to break on non key frames.</param>
|
|
||||||
/// <param name="audioSampleRate">Optional. Specify a specific audio sample rate, e.g. 44100.</param>
|
/// <param name="audioSampleRate">Optional. Specify a specific audio sample rate, e.g. 44100.</param>
|
||||||
/// <param name="maxAudioBitDepth">Optional. The maximum audio bit depth.</param>
|
/// <param name="maxAudioBitDepth">Optional. The maximum audio bit depth.</param>
|
||||||
/// <param name="audioBitRate">Optional. Specify an audio bitrate to encode to, e.g. 128000. If omitted this will be left to encoder defaults.</param>
|
/// <param name="audioBitRate">Optional. Specify an audio bitrate to encode to, e.g. 128000. If omitted this will be left to encoder defaults.</param>
|
||||||
|
|
@ -274,7 +270,6 @@ public class AudioController : BaseJellyfinApiController
|
||||||
[FromQuery] bool? enableAutoStreamCopy,
|
[FromQuery] bool? enableAutoStreamCopy,
|
||||||
[FromQuery] bool? allowVideoStreamCopy,
|
[FromQuery] bool? allowVideoStreamCopy,
|
||||||
[FromQuery] bool? allowAudioStreamCopy,
|
[FromQuery] bool? allowAudioStreamCopy,
|
||||||
[FromQuery] bool? breakOnNonKeyFrames,
|
|
||||||
[FromQuery] int? audioSampleRate,
|
[FromQuery] int? audioSampleRate,
|
||||||
[FromQuery] int? maxAudioBitDepth,
|
[FromQuery] int? maxAudioBitDepth,
|
||||||
[FromQuery] int? audioBitRate,
|
[FromQuery] int? audioBitRate,
|
||||||
|
|
@ -326,7 +321,6 @@ public class AudioController : BaseJellyfinApiController
|
||||||
EnableAutoStreamCopy = enableAutoStreamCopy ?? true,
|
EnableAutoStreamCopy = enableAutoStreamCopy ?? true,
|
||||||
AllowAudioStreamCopy = allowAudioStreamCopy ?? true,
|
AllowAudioStreamCopy = allowAudioStreamCopy ?? true,
|
||||||
AllowVideoStreamCopy = allowVideoStreamCopy ?? true,
|
AllowVideoStreamCopy = allowVideoStreamCopy ?? true,
|
||||||
BreakOnNonKeyFrames = breakOnNonKeyFrames ?? false,
|
|
||||||
AudioSampleRate = audioSampleRate,
|
AudioSampleRate = audioSampleRate,
|
||||||
MaxAudioChannels = maxAudioChannels,
|
MaxAudioChannels = maxAudioChannels,
|
||||||
AudioBitRate = audioBitRate,
|
AudioBitRate = audioBitRate,
|
||||||
|
|
|
||||||
|
|
@ -122,7 +122,6 @@ public class DynamicHlsController : BaseJellyfinApiController
|
||||||
/// <param name="enableAutoStreamCopy">Whether or not to allow automatic stream copy if requested values match the original source. Defaults to true.</param>
|
/// <param name="enableAutoStreamCopy">Whether or not to allow automatic stream copy if requested values match the original source. Defaults to true.</param>
|
||||||
/// <param name="allowVideoStreamCopy">Whether or not to allow copying of the video stream url.</param>
|
/// <param name="allowVideoStreamCopy">Whether or not to allow copying of the video stream url.</param>
|
||||||
/// <param name="allowAudioStreamCopy">Whether or not to allow copying of the audio stream url.</param>
|
/// <param name="allowAudioStreamCopy">Whether or not to allow copying of the audio stream url.</param>
|
||||||
/// <param name="breakOnNonKeyFrames">Optional. Whether to break on non key frames.</param>
|
|
||||||
/// <param name="audioSampleRate">Optional. Specify a specific audio sample rate, e.g. 44100.</param>
|
/// <param name="audioSampleRate">Optional. Specify a specific audio sample rate, e.g. 44100.</param>
|
||||||
/// <param name="maxAudioBitDepth">Optional. The maximum audio bit depth.</param>
|
/// <param name="maxAudioBitDepth">Optional. The maximum audio bit depth.</param>
|
||||||
/// <param name="audioBitRate">Optional. Specify an audio bitrate to encode to, e.g. 128000. If omitted this will be left to encoder defaults.</param>
|
/// <param name="audioBitRate">Optional. Specify an audio bitrate to encode to, e.g. 128000. If omitted this will be left to encoder defaults.</param>
|
||||||
|
|
@ -182,7 +181,6 @@ public class DynamicHlsController : BaseJellyfinApiController
|
||||||
[FromQuery] bool? enableAutoStreamCopy,
|
[FromQuery] bool? enableAutoStreamCopy,
|
||||||
[FromQuery] bool? allowVideoStreamCopy,
|
[FromQuery] bool? allowVideoStreamCopy,
|
||||||
[FromQuery] bool? allowAudioStreamCopy,
|
[FromQuery] bool? allowAudioStreamCopy,
|
||||||
[FromQuery] bool? breakOnNonKeyFrames,
|
|
||||||
[FromQuery] int? audioSampleRate,
|
[FromQuery] int? audioSampleRate,
|
||||||
[FromQuery] int? maxAudioBitDepth,
|
[FromQuery] int? maxAudioBitDepth,
|
||||||
[FromQuery] int? audioBitRate,
|
[FromQuery] int? audioBitRate,
|
||||||
|
|
@ -238,7 +236,6 @@ public class DynamicHlsController : BaseJellyfinApiController
|
||||||
EnableAutoStreamCopy = enableAutoStreamCopy ?? true,
|
EnableAutoStreamCopy = enableAutoStreamCopy ?? true,
|
||||||
AllowAudioStreamCopy = allowAudioStreamCopy ?? true,
|
AllowAudioStreamCopy = allowAudioStreamCopy ?? true,
|
||||||
AllowVideoStreamCopy = allowVideoStreamCopy ?? true,
|
AllowVideoStreamCopy = allowVideoStreamCopy ?? true,
|
||||||
BreakOnNonKeyFrames = breakOnNonKeyFrames ?? false,
|
|
||||||
AudioSampleRate = audioSampleRate,
|
AudioSampleRate = audioSampleRate,
|
||||||
MaxAudioChannels = maxAudioChannels,
|
MaxAudioChannels = maxAudioChannels,
|
||||||
AudioBitRate = audioBitRate,
|
AudioBitRate = audioBitRate,
|
||||||
|
|
@ -364,7 +361,6 @@ public class DynamicHlsController : BaseJellyfinApiController
|
||||||
/// <param name="enableAutoStreamCopy">Whether or not to allow automatic stream copy if requested values match the original source. Defaults to true.</param>
|
/// <param name="enableAutoStreamCopy">Whether or not to allow automatic stream copy if requested values match the original source. Defaults to true.</param>
|
||||||
/// <param name="allowVideoStreamCopy">Whether or not to allow copying of the video stream url.</param>
|
/// <param name="allowVideoStreamCopy">Whether or not to allow copying of the video stream url.</param>
|
||||||
/// <param name="allowAudioStreamCopy">Whether or not to allow copying of the audio stream url.</param>
|
/// <param name="allowAudioStreamCopy">Whether or not to allow copying of the audio stream url.</param>
|
||||||
/// <param name="breakOnNonKeyFrames">Optional. Whether to break on non key frames.</param>
|
|
||||||
/// <param name="audioSampleRate">Optional. Specify a specific audio sample rate, e.g. 44100.</param>
|
/// <param name="audioSampleRate">Optional. Specify a specific audio sample rate, e.g. 44100.</param>
|
||||||
/// <param name="maxAudioBitDepth">Optional. The maximum audio bit depth.</param>
|
/// <param name="maxAudioBitDepth">Optional. The maximum audio bit depth.</param>
|
||||||
/// <param name="audioBitRate">Optional. Specify an audio bitrate to encode to, e.g. 128000. If omitted this will be left to encoder defaults.</param>
|
/// <param name="audioBitRate">Optional. Specify an audio bitrate to encode to, e.g. 128000. If omitted this will be left to encoder defaults.</param>
|
||||||
|
|
@ -425,7 +421,6 @@ public class DynamicHlsController : BaseJellyfinApiController
|
||||||
[FromQuery] bool? enableAutoStreamCopy,
|
[FromQuery] bool? enableAutoStreamCopy,
|
||||||
[FromQuery] bool? allowVideoStreamCopy,
|
[FromQuery] bool? allowVideoStreamCopy,
|
||||||
[FromQuery] bool? allowAudioStreamCopy,
|
[FromQuery] bool? allowAudioStreamCopy,
|
||||||
[FromQuery] bool? breakOnNonKeyFrames,
|
|
||||||
[FromQuery] int? audioSampleRate,
|
[FromQuery] int? audioSampleRate,
|
||||||
[FromQuery] int? maxAudioBitDepth,
|
[FromQuery] int? maxAudioBitDepth,
|
||||||
[FromQuery] int? audioBitRate,
|
[FromQuery] int? audioBitRate,
|
||||||
|
|
@ -481,7 +476,6 @@ public class DynamicHlsController : BaseJellyfinApiController
|
||||||
EnableAutoStreamCopy = enableAutoStreamCopy ?? true,
|
EnableAutoStreamCopy = enableAutoStreamCopy ?? true,
|
||||||
AllowAudioStreamCopy = allowAudioStreamCopy ?? true,
|
AllowAudioStreamCopy = allowAudioStreamCopy ?? true,
|
||||||
AllowVideoStreamCopy = allowVideoStreamCopy ?? true,
|
AllowVideoStreamCopy = allowVideoStreamCopy ?? true,
|
||||||
BreakOnNonKeyFrames = breakOnNonKeyFrames ?? false,
|
|
||||||
AudioSampleRate = audioSampleRate,
|
AudioSampleRate = audioSampleRate,
|
||||||
MaxAudioChannels = maxAudioChannels,
|
MaxAudioChannels = maxAudioChannels,
|
||||||
AudioBitRate = audioBitRate,
|
AudioBitRate = audioBitRate,
|
||||||
|
|
@ -543,7 +537,6 @@ public class DynamicHlsController : BaseJellyfinApiController
|
||||||
/// <param name="enableAutoStreamCopy">Whether or not to allow automatic stream copy if requested values match the original source. Defaults to true.</param>
|
/// <param name="enableAutoStreamCopy">Whether or not to allow automatic stream copy if requested values match the original source. Defaults to true.</param>
|
||||||
/// <param name="allowVideoStreamCopy">Whether or not to allow copying of the video stream url.</param>
|
/// <param name="allowVideoStreamCopy">Whether or not to allow copying of the video stream url.</param>
|
||||||
/// <param name="allowAudioStreamCopy">Whether or not to allow copying of the audio stream url.</param>
|
/// <param name="allowAudioStreamCopy">Whether or not to allow copying of the audio stream url.</param>
|
||||||
/// <param name="breakOnNonKeyFrames">Optional. Whether to break on non key frames.</param>
|
|
||||||
/// <param name="audioSampleRate">Optional. Specify a specific audio sample rate, e.g. 44100.</param>
|
/// <param name="audioSampleRate">Optional. Specify a specific audio sample rate, e.g. 44100.</param>
|
||||||
/// <param name="maxAudioBitDepth">Optional. The maximum audio bit depth.</param>
|
/// <param name="maxAudioBitDepth">Optional. The maximum audio bit depth.</param>
|
||||||
/// <param name="maxStreamingBitrate">Optional. The maximum streaming bitrate.</param>
|
/// <param name="maxStreamingBitrate">Optional. The maximum streaming bitrate.</param>
|
||||||
|
|
@ -601,7 +594,6 @@ public class DynamicHlsController : BaseJellyfinApiController
|
||||||
[FromQuery] bool? enableAutoStreamCopy,
|
[FromQuery] bool? enableAutoStreamCopy,
|
||||||
[FromQuery] bool? allowVideoStreamCopy,
|
[FromQuery] bool? allowVideoStreamCopy,
|
||||||
[FromQuery] bool? allowAudioStreamCopy,
|
[FromQuery] bool? allowAudioStreamCopy,
|
||||||
[FromQuery] bool? breakOnNonKeyFrames,
|
|
||||||
[FromQuery] int? audioSampleRate,
|
[FromQuery] int? audioSampleRate,
|
||||||
[FromQuery] int? maxAudioBitDepth,
|
[FromQuery] int? maxAudioBitDepth,
|
||||||
[FromQuery] int? maxStreamingBitrate,
|
[FromQuery] int? maxStreamingBitrate,
|
||||||
|
|
@ -654,7 +646,6 @@ public class DynamicHlsController : BaseJellyfinApiController
|
||||||
EnableAutoStreamCopy = enableAutoStreamCopy ?? true,
|
EnableAutoStreamCopy = enableAutoStreamCopy ?? true,
|
||||||
AllowAudioStreamCopy = allowAudioStreamCopy ?? true,
|
AllowAudioStreamCopy = allowAudioStreamCopy ?? true,
|
||||||
AllowVideoStreamCopy = allowVideoStreamCopy ?? true,
|
AllowVideoStreamCopy = allowVideoStreamCopy ?? true,
|
||||||
BreakOnNonKeyFrames = breakOnNonKeyFrames ?? false,
|
|
||||||
AudioSampleRate = audioSampleRate,
|
AudioSampleRate = audioSampleRate,
|
||||||
MaxAudioChannels = maxAudioChannels,
|
MaxAudioChannels = maxAudioChannels,
|
||||||
AudioBitRate = audioBitRate ?? maxStreamingBitrate,
|
AudioBitRate = audioBitRate ?? maxStreamingBitrate,
|
||||||
|
|
@ -713,7 +704,6 @@ public class DynamicHlsController : BaseJellyfinApiController
|
||||||
/// <param name="enableAutoStreamCopy">Whether or not to allow automatic stream copy if requested values match the original source. Defaults to true.</param>
|
/// <param name="enableAutoStreamCopy">Whether or not to allow automatic stream copy if requested values match the original source. Defaults to true.</param>
|
||||||
/// <param name="allowVideoStreamCopy">Whether or not to allow copying of the video stream url.</param>
|
/// <param name="allowVideoStreamCopy">Whether or not to allow copying of the video stream url.</param>
|
||||||
/// <param name="allowAudioStreamCopy">Whether or not to allow copying of the audio stream url.</param>
|
/// <param name="allowAudioStreamCopy">Whether or not to allow copying of the audio stream url.</param>
|
||||||
/// <param name="breakOnNonKeyFrames">Optional. Whether to break on non key frames.</param>
|
|
||||||
/// <param name="audioSampleRate">Optional. Specify a specific audio sample rate, e.g. 44100.</param>
|
/// <param name="audioSampleRate">Optional. Specify a specific audio sample rate, e.g. 44100.</param>
|
||||||
/// <param name="maxAudioBitDepth">Optional. The maximum audio bit depth.</param>
|
/// <param name="maxAudioBitDepth">Optional. The maximum audio bit depth.</param>
|
||||||
/// <param name="audioBitRate">Optional. Specify an audio bitrate to encode to, e.g. 128000. If omitted this will be left to encoder defaults.</param>
|
/// <param name="audioBitRate">Optional. Specify an audio bitrate to encode to, e.g. 128000. If omitted this will be left to encoder defaults.</param>
|
||||||
|
|
@ -771,7 +761,6 @@ public class DynamicHlsController : BaseJellyfinApiController
|
||||||
[FromQuery] bool? enableAutoStreamCopy,
|
[FromQuery] bool? enableAutoStreamCopy,
|
||||||
[FromQuery] bool? allowVideoStreamCopy,
|
[FromQuery] bool? allowVideoStreamCopy,
|
||||||
[FromQuery] bool? allowAudioStreamCopy,
|
[FromQuery] bool? allowAudioStreamCopy,
|
||||||
[FromQuery] bool? breakOnNonKeyFrames,
|
|
||||||
[FromQuery] int? audioSampleRate,
|
[FromQuery] int? audioSampleRate,
|
||||||
[FromQuery] int? maxAudioBitDepth,
|
[FromQuery] int? maxAudioBitDepth,
|
||||||
[FromQuery] int? audioBitRate,
|
[FromQuery] int? audioBitRate,
|
||||||
|
|
@ -826,7 +815,6 @@ public class DynamicHlsController : BaseJellyfinApiController
|
||||||
EnableAutoStreamCopy = enableAutoStreamCopy ?? true,
|
EnableAutoStreamCopy = enableAutoStreamCopy ?? true,
|
||||||
AllowAudioStreamCopy = allowAudioStreamCopy ?? true,
|
AllowAudioStreamCopy = allowAudioStreamCopy ?? true,
|
||||||
AllowVideoStreamCopy = allowVideoStreamCopy ?? true,
|
AllowVideoStreamCopy = allowVideoStreamCopy ?? true,
|
||||||
BreakOnNonKeyFrames = breakOnNonKeyFrames ?? false,
|
|
||||||
AudioSampleRate = audioSampleRate,
|
AudioSampleRate = audioSampleRate,
|
||||||
MaxAudioChannels = maxAudioChannels,
|
MaxAudioChannels = maxAudioChannels,
|
||||||
AudioBitRate = audioBitRate,
|
AudioBitRate = audioBitRate,
|
||||||
|
|
@ -887,7 +875,6 @@ public class DynamicHlsController : BaseJellyfinApiController
|
||||||
/// <param name="enableAutoStreamCopy">Whether or not to allow automatic stream copy if requested values match the original source. Defaults to true.</param>
|
/// <param name="enableAutoStreamCopy">Whether or not to allow automatic stream copy if requested values match the original source. Defaults to true.</param>
|
||||||
/// <param name="allowVideoStreamCopy">Whether or not to allow copying of the video stream url.</param>
|
/// <param name="allowVideoStreamCopy">Whether or not to allow copying of the video stream url.</param>
|
||||||
/// <param name="allowAudioStreamCopy">Whether or not to allow copying of the audio stream url.</param>
|
/// <param name="allowAudioStreamCopy">Whether or not to allow copying of the audio stream url.</param>
|
||||||
/// <param name="breakOnNonKeyFrames">Optional. Whether to break on non key frames.</param>
|
|
||||||
/// <param name="audioSampleRate">Optional. Specify a specific audio sample rate, e.g. 44100.</param>
|
/// <param name="audioSampleRate">Optional. Specify a specific audio sample rate, e.g. 44100.</param>
|
||||||
/// <param name="maxAudioBitDepth">Optional. The maximum audio bit depth.</param>
|
/// <param name="maxAudioBitDepth">Optional. The maximum audio bit depth.</param>
|
||||||
/// <param name="maxStreamingBitrate">Optional. The maximum streaming bitrate.</param>
|
/// <param name="maxStreamingBitrate">Optional. The maximum streaming bitrate.</param>
|
||||||
|
|
@ -943,7 +930,6 @@ public class DynamicHlsController : BaseJellyfinApiController
|
||||||
[FromQuery] bool? enableAutoStreamCopy,
|
[FromQuery] bool? enableAutoStreamCopy,
|
||||||
[FromQuery] bool? allowVideoStreamCopy,
|
[FromQuery] bool? allowVideoStreamCopy,
|
||||||
[FromQuery] bool? allowAudioStreamCopy,
|
[FromQuery] bool? allowAudioStreamCopy,
|
||||||
[FromQuery] bool? breakOnNonKeyFrames,
|
|
||||||
[FromQuery] int? audioSampleRate,
|
[FromQuery] int? audioSampleRate,
|
||||||
[FromQuery] int? maxAudioBitDepth,
|
[FromQuery] int? maxAudioBitDepth,
|
||||||
[FromQuery] int? maxStreamingBitrate,
|
[FromQuery] int? maxStreamingBitrate,
|
||||||
|
|
@ -996,7 +982,6 @@ public class DynamicHlsController : BaseJellyfinApiController
|
||||||
EnableAutoStreamCopy = enableAutoStreamCopy ?? true,
|
EnableAutoStreamCopy = enableAutoStreamCopy ?? true,
|
||||||
AllowAudioStreamCopy = allowAudioStreamCopy ?? true,
|
AllowAudioStreamCopy = allowAudioStreamCopy ?? true,
|
||||||
AllowVideoStreamCopy = allowVideoStreamCopy ?? true,
|
AllowVideoStreamCopy = allowVideoStreamCopy ?? true,
|
||||||
BreakOnNonKeyFrames = breakOnNonKeyFrames ?? false,
|
|
||||||
AudioSampleRate = audioSampleRate,
|
AudioSampleRate = audioSampleRate,
|
||||||
MaxAudioChannels = maxAudioChannels,
|
MaxAudioChannels = maxAudioChannels,
|
||||||
AudioBitRate = audioBitRate ?? maxStreamingBitrate,
|
AudioBitRate = audioBitRate ?? maxStreamingBitrate,
|
||||||
|
|
@ -1060,7 +1045,6 @@ public class DynamicHlsController : BaseJellyfinApiController
|
||||||
/// <param name="enableAutoStreamCopy">Whether or not to allow automatic stream copy if requested values match the original source. Defaults to true.</param>
|
/// <param name="enableAutoStreamCopy">Whether or not to allow automatic stream copy if requested values match the original source. Defaults to true.</param>
|
||||||
/// <param name="allowVideoStreamCopy">Whether or not to allow copying of the video stream url.</param>
|
/// <param name="allowVideoStreamCopy">Whether or not to allow copying of the video stream url.</param>
|
||||||
/// <param name="allowAudioStreamCopy">Whether or not to allow copying of the audio stream url.</param>
|
/// <param name="allowAudioStreamCopy">Whether or not to allow copying of the audio stream url.</param>
|
||||||
/// <param name="breakOnNonKeyFrames">Optional. Whether to break on non key frames.</param>
|
|
||||||
/// <param name="audioSampleRate">Optional. Specify a specific audio sample rate, e.g. 44100.</param>
|
/// <param name="audioSampleRate">Optional. Specify a specific audio sample rate, e.g. 44100.</param>
|
||||||
/// <param name="maxAudioBitDepth">Optional. The maximum audio bit depth.</param>
|
/// <param name="maxAudioBitDepth">Optional. The maximum audio bit depth.</param>
|
||||||
/// <param name="audioBitRate">Optional. Specify an audio bitrate to encode to, e.g. 128000. If omitted this will be left to encoder defaults.</param>
|
/// <param name="audioBitRate">Optional. Specify an audio bitrate to encode to, e.g. 128000. If omitted this will be left to encoder defaults.</param>
|
||||||
|
|
@ -1124,7 +1108,6 @@ public class DynamicHlsController : BaseJellyfinApiController
|
||||||
[FromQuery] bool? enableAutoStreamCopy,
|
[FromQuery] bool? enableAutoStreamCopy,
|
||||||
[FromQuery] bool? allowVideoStreamCopy,
|
[FromQuery] bool? allowVideoStreamCopy,
|
||||||
[FromQuery] bool? allowAudioStreamCopy,
|
[FromQuery] bool? allowAudioStreamCopy,
|
||||||
[FromQuery] bool? breakOnNonKeyFrames,
|
|
||||||
[FromQuery] int? audioSampleRate,
|
[FromQuery] int? audioSampleRate,
|
||||||
[FromQuery] int? maxAudioBitDepth,
|
[FromQuery] int? maxAudioBitDepth,
|
||||||
[FromQuery] int? audioBitRate,
|
[FromQuery] int? audioBitRate,
|
||||||
|
|
@ -1181,7 +1164,6 @@ public class DynamicHlsController : BaseJellyfinApiController
|
||||||
EnableAutoStreamCopy = enableAutoStreamCopy ?? true,
|
EnableAutoStreamCopy = enableAutoStreamCopy ?? true,
|
||||||
AllowAudioStreamCopy = allowAudioStreamCopy ?? true,
|
AllowAudioStreamCopy = allowAudioStreamCopy ?? true,
|
||||||
AllowVideoStreamCopy = allowVideoStreamCopy ?? true,
|
AllowVideoStreamCopy = allowVideoStreamCopy ?? true,
|
||||||
BreakOnNonKeyFrames = breakOnNonKeyFrames ?? false,
|
|
||||||
AudioSampleRate = audioSampleRate,
|
AudioSampleRate = audioSampleRate,
|
||||||
MaxAudioChannels = maxAudioChannels,
|
MaxAudioChannels = maxAudioChannels,
|
||||||
AudioBitRate = audioBitRate,
|
AudioBitRate = audioBitRate,
|
||||||
|
|
@ -1247,7 +1229,6 @@ public class DynamicHlsController : BaseJellyfinApiController
|
||||||
/// <param name="enableAutoStreamCopy">Whether or not to allow automatic stream copy if requested values match the original source. Defaults to true.</param>
|
/// <param name="enableAutoStreamCopy">Whether or not to allow automatic stream copy if requested values match the original source. Defaults to true.</param>
|
||||||
/// <param name="allowVideoStreamCopy">Whether or not to allow copying of the video stream url.</param>
|
/// <param name="allowVideoStreamCopy">Whether or not to allow copying of the video stream url.</param>
|
||||||
/// <param name="allowAudioStreamCopy">Whether or not to allow copying of the audio stream url.</param>
|
/// <param name="allowAudioStreamCopy">Whether or not to allow copying of the audio stream url.</param>
|
||||||
/// <param name="breakOnNonKeyFrames">Optional. Whether to break on non key frames.</param>
|
|
||||||
/// <param name="audioSampleRate">Optional. Specify a specific audio sample rate, e.g. 44100.</param>
|
/// <param name="audioSampleRate">Optional. Specify a specific audio sample rate, e.g. 44100.</param>
|
||||||
/// <param name="maxAudioBitDepth">Optional. The maximum audio bit depth.</param>
|
/// <param name="maxAudioBitDepth">Optional. The maximum audio bit depth.</param>
|
||||||
/// <param name="maxStreamingBitrate">Optional. The maximum streaming bitrate.</param>
|
/// <param name="maxStreamingBitrate">Optional. The maximum streaming bitrate.</param>
|
||||||
|
|
@ -1309,7 +1290,6 @@ public class DynamicHlsController : BaseJellyfinApiController
|
||||||
[FromQuery] bool? enableAutoStreamCopy,
|
[FromQuery] bool? enableAutoStreamCopy,
|
||||||
[FromQuery] bool? allowVideoStreamCopy,
|
[FromQuery] bool? allowVideoStreamCopy,
|
||||||
[FromQuery] bool? allowAudioStreamCopy,
|
[FromQuery] bool? allowAudioStreamCopy,
|
||||||
[FromQuery] bool? breakOnNonKeyFrames,
|
|
||||||
[FromQuery] int? audioSampleRate,
|
[FromQuery] int? audioSampleRate,
|
||||||
[FromQuery] int? maxAudioBitDepth,
|
[FromQuery] int? maxAudioBitDepth,
|
||||||
[FromQuery] int? maxStreamingBitrate,
|
[FromQuery] int? maxStreamingBitrate,
|
||||||
|
|
@ -1364,7 +1344,6 @@ public class DynamicHlsController : BaseJellyfinApiController
|
||||||
EnableAutoStreamCopy = enableAutoStreamCopy ?? true,
|
EnableAutoStreamCopy = enableAutoStreamCopy ?? true,
|
||||||
AllowAudioStreamCopy = allowAudioStreamCopy ?? true,
|
AllowAudioStreamCopy = allowAudioStreamCopy ?? true,
|
||||||
AllowVideoStreamCopy = allowVideoStreamCopy ?? true,
|
AllowVideoStreamCopy = allowVideoStreamCopy ?? true,
|
||||||
BreakOnNonKeyFrames = breakOnNonKeyFrames ?? false,
|
|
||||||
AudioSampleRate = audioSampleRate,
|
AudioSampleRate = audioSampleRate,
|
||||||
MaxAudioChannels = maxAudioChannels,
|
MaxAudioChannels = maxAudioChannels,
|
||||||
AudioBitRate = audioBitRate ?? maxStreamingBitrate,
|
AudioBitRate = audioBitRate ?? maxStreamingBitrate,
|
||||||
|
|
@ -1586,16 +1565,6 @@ public class DynamicHlsController : BaseJellyfinApiController
|
||||||
var videoCodec = _encodingHelper.GetVideoEncoder(state, _encodingOptions);
|
var videoCodec = _encodingHelper.GetVideoEncoder(state, _encodingOptions);
|
||||||
var threads = EncodingHelper.GetNumberOfThreads(state, _encodingOptions, videoCodec);
|
var threads = EncodingHelper.GetNumberOfThreads(state, _encodingOptions, videoCodec);
|
||||||
|
|
||||||
if (state.BaseRequest.BreakOnNonKeyFrames)
|
|
||||||
{
|
|
||||||
// FIXME: this is actually a workaround, as ideally it really should be the client which decides whether non-keyframe
|
|
||||||
// breakpoints are supported; but current implementation always uses "ffmpeg input seeking" which is liable
|
|
||||||
// to produce a missing part of video stream before first keyframe is encountered, which may lead to
|
|
||||||
// awkward cases like a few starting HLS segments having no video whatsoever, which breaks hls.js
|
|
||||||
_logger.LogInformation("Current HLS implementation doesn't support non-keyframe breaks but one is requested, ignoring that request");
|
|
||||||
state.BaseRequest.BreakOnNonKeyFrames = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
var mapArgs = state.IsOutputVideo ? _encodingHelper.GetMapArgs(state) : string.Empty;
|
var mapArgs = state.IsOutputVideo ? _encodingHelper.GetMapArgs(state) : string.Empty;
|
||||||
|
|
||||||
var directory = Path.GetDirectoryName(outputPath) ?? throw new ArgumentException($"Provided path ({outputPath}) is not valid.", nameof(outputPath));
|
var directory = Path.GetDirectoryName(outputPath) ?? throw new ArgumentException($"Provided path ({outputPath}) is not valid.", nameof(outputPath));
|
||||||
|
|
@ -1746,11 +1715,6 @@ public class DynamicHlsController : BaseJellyfinApiController
|
||||||
var videoCodec = _encodingHelper.GetVideoEncoder(state, _encodingOptions);
|
var videoCodec = _encodingHelper.GetVideoEncoder(state, _encodingOptions);
|
||||||
var copyArgs = "-codec:a:0 copy" + bitStreamArgs + strictArgs;
|
var copyArgs = "-codec:a:0 copy" + bitStreamArgs + strictArgs;
|
||||||
|
|
||||||
if (EncodingHelper.IsCopyCodec(videoCodec) && state.EnableBreakOnNonKeyFrames(videoCodec))
|
|
||||||
{
|
|
||||||
return copyArgs + " -copypriorss:a:0 0";
|
|
||||||
}
|
|
||||||
|
|
||||||
return copyArgs;
|
return copyArgs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -83,7 +83,6 @@ public class UniversalAudioController : BaseJellyfinApiController
|
||||||
/// <param name="maxAudioBitDepth">Optional. The maximum audio bit depth.</param>
|
/// <param name="maxAudioBitDepth">Optional. The maximum audio bit depth.</param>
|
||||||
/// <param name="enableRemoteMedia">Optional. Whether to enable remote media.</param>
|
/// <param name="enableRemoteMedia">Optional. Whether to enable remote media.</param>
|
||||||
/// <param name="enableAudioVbrEncoding">Optional. Whether to enable Audio Encoding.</param>
|
/// <param name="enableAudioVbrEncoding">Optional. Whether to enable Audio Encoding.</param>
|
||||||
/// <param name="breakOnNonKeyFrames">Optional. Whether to break on non key frames.</param>
|
|
||||||
/// <param name="enableRedirection">Whether to enable redirection. Defaults to true.</param>
|
/// <param name="enableRedirection">Whether to enable redirection. Defaults to true.</param>
|
||||||
/// <response code="200">Audio stream returned.</response>
|
/// <response code="200">Audio stream returned.</response>
|
||||||
/// <response code="302">Redirected to remote audio stream.</response>
|
/// <response code="302">Redirected to remote audio stream.</response>
|
||||||
|
|
@ -114,7 +113,6 @@ public class UniversalAudioController : BaseJellyfinApiController
|
||||||
[FromQuery] int? maxAudioBitDepth,
|
[FromQuery] int? maxAudioBitDepth,
|
||||||
[FromQuery] bool? enableRemoteMedia,
|
[FromQuery] bool? enableRemoteMedia,
|
||||||
[FromQuery] bool enableAudioVbrEncoding = true,
|
[FromQuery] bool enableAudioVbrEncoding = true,
|
||||||
[FromQuery] bool breakOnNonKeyFrames = false,
|
|
||||||
[FromQuery] bool enableRedirection = true)
|
[FromQuery] bool enableRedirection = true)
|
||||||
{
|
{
|
||||||
userId = RequestHelpers.GetUserId(User, userId);
|
userId = RequestHelpers.GetUserId(User, userId);
|
||||||
|
|
@ -127,7 +125,7 @@ public class UniversalAudioController : BaseJellyfinApiController
|
||||||
return NotFound();
|
return NotFound();
|
||||||
}
|
}
|
||||||
|
|
||||||
var deviceProfile = GetDeviceProfile(container, transcodingContainer, audioCodec, transcodingProtocol, breakOnNonKeyFrames, transcodingAudioChannels, maxAudioSampleRate, maxAudioBitDepth, maxAudioChannels);
|
var deviceProfile = GetDeviceProfile(container, transcodingContainer, audioCodec, transcodingProtocol, transcodingAudioChannels, maxAudioSampleRate, maxAudioBitDepth, maxAudioChannels);
|
||||||
|
|
||||||
_logger.LogInformation("GetPostedPlaybackInfo profile: {@Profile}", deviceProfile);
|
_logger.LogInformation("GetPostedPlaybackInfo profile: {@Profile}", deviceProfile);
|
||||||
|
|
||||||
|
|
@ -208,7 +206,6 @@ public class UniversalAudioController : BaseJellyfinApiController
|
||||||
EnableAutoStreamCopy = true,
|
EnableAutoStreamCopy = true,
|
||||||
AllowAudioStreamCopy = true,
|
AllowAudioStreamCopy = true,
|
||||||
AllowVideoStreamCopy = true,
|
AllowVideoStreamCopy = true,
|
||||||
BreakOnNonKeyFrames = breakOnNonKeyFrames,
|
|
||||||
AudioSampleRate = maxAudioSampleRate,
|
AudioSampleRate = maxAudioSampleRate,
|
||||||
MaxAudioChannels = maxAudioChannels,
|
MaxAudioChannels = maxAudioChannels,
|
||||||
MaxAudioBitDepth = maxAudioBitDepth,
|
MaxAudioBitDepth = maxAudioBitDepth,
|
||||||
|
|
@ -242,7 +239,6 @@ public class UniversalAudioController : BaseJellyfinApiController
|
||||||
EnableAutoStreamCopy = true,
|
EnableAutoStreamCopy = true,
|
||||||
AllowAudioStreamCopy = true,
|
AllowAudioStreamCopy = true,
|
||||||
AllowVideoStreamCopy = true,
|
AllowVideoStreamCopy = true,
|
||||||
BreakOnNonKeyFrames = breakOnNonKeyFrames,
|
|
||||||
AudioSampleRate = maxAudioSampleRate,
|
AudioSampleRate = maxAudioSampleRate,
|
||||||
MaxAudioChannels = maxAudioChannels,
|
MaxAudioChannels = maxAudioChannels,
|
||||||
AudioBitRate = isStatic ? null : (audioBitRate ?? maxStreamingBitrate),
|
AudioBitRate = isStatic ? null : (audioBitRate ?? maxStreamingBitrate),
|
||||||
|
|
@ -263,7 +259,6 @@ public class UniversalAudioController : BaseJellyfinApiController
|
||||||
string? transcodingContainer,
|
string? transcodingContainer,
|
||||||
string? audioCodec,
|
string? audioCodec,
|
||||||
MediaStreamProtocol? transcodingProtocol,
|
MediaStreamProtocol? transcodingProtocol,
|
||||||
bool? breakOnNonKeyFrames,
|
|
||||||
int? transcodingAudioChannels,
|
int? transcodingAudioChannels,
|
||||||
int? maxAudioSampleRate,
|
int? maxAudioSampleRate,
|
||||||
int? maxAudioBitDepth,
|
int? maxAudioBitDepth,
|
||||||
|
|
@ -298,7 +293,6 @@ public class UniversalAudioController : BaseJellyfinApiController
|
||||||
Container = transcodingContainer ?? "mp3",
|
Container = transcodingContainer ?? "mp3",
|
||||||
AudioCodec = audioCodec ?? "mp3",
|
AudioCodec = audioCodec ?? "mp3",
|
||||||
Protocol = transcodingProtocol ?? MediaStreamProtocol.http,
|
Protocol = transcodingProtocol ?? MediaStreamProtocol.http,
|
||||||
BreakOnNonKeyFrames = breakOnNonKeyFrames ?? false,
|
|
||||||
MaxAudioChannels = transcodingAudioChannels?.ToString(CultureInfo.InvariantCulture)
|
MaxAudioChannels = transcodingAudioChannels?.ToString(CultureInfo.InvariantCulture)
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -270,7 +270,6 @@ public class VideosController : BaseJellyfinApiController
|
||||||
/// <param name="enableAutoStreamCopy">Whether or not to allow automatic stream copy if requested values match the original source. Defaults to true.</param>
|
/// <param name="enableAutoStreamCopy">Whether or not to allow automatic stream copy if requested values match the original source. Defaults to true.</param>
|
||||||
/// <param name="allowVideoStreamCopy">Whether or not to allow copying of the video stream url.</param>
|
/// <param name="allowVideoStreamCopy">Whether or not to allow copying of the video stream url.</param>
|
||||||
/// <param name="allowAudioStreamCopy">Whether or not to allow copying of the audio stream url.</param>
|
/// <param name="allowAudioStreamCopy">Whether or not to allow copying of the audio stream url.</param>
|
||||||
/// <param name="breakOnNonKeyFrames">Optional. Whether to break on non key frames.</param>
|
|
||||||
/// <param name="audioSampleRate">Optional. Specify a specific audio sample rate, e.g. 44100.</param>
|
/// <param name="audioSampleRate">Optional. Specify a specific audio sample rate, e.g. 44100.</param>
|
||||||
/// <param name="maxAudioBitDepth">Optional. The maximum audio bit depth.</param>
|
/// <param name="maxAudioBitDepth">Optional. The maximum audio bit depth.</param>
|
||||||
/// <param name="audioBitRate">Optional. Specify an audio bitrate to encode to, e.g. 128000. If omitted this will be left to encoder defaults.</param>
|
/// <param name="audioBitRate">Optional. Specify an audio bitrate to encode to, e.g. 128000. If omitted this will be left to encoder defaults.</param>
|
||||||
|
|
@ -329,7 +328,6 @@ public class VideosController : BaseJellyfinApiController
|
||||||
[FromQuery] bool? enableAutoStreamCopy,
|
[FromQuery] bool? enableAutoStreamCopy,
|
||||||
[FromQuery] bool? allowVideoStreamCopy,
|
[FromQuery] bool? allowVideoStreamCopy,
|
||||||
[FromQuery] bool? allowAudioStreamCopy,
|
[FromQuery] bool? allowAudioStreamCopy,
|
||||||
[FromQuery] bool? breakOnNonKeyFrames,
|
|
||||||
[FromQuery] int? audioSampleRate,
|
[FromQuery] int? audioSampleRate,
|
||||||
[FromQuery] int? maxAudioBitDepth,
|
[FromQuery] int? maxAudioBitDepth,
|
||||||
[FromQuery] int? audioBitRate,
|
[FromQuery] int? audioBitRate,
|
||||||
|
|
@ -386,7 +384,6 @@ public class VideosController : BaseJellyfinApiController
|
||||||
EnableAutoStreamCopy = enableAutoStreamCopy ?? true,
|
EnableAutoStreamCopy = enableAutoStreamCopy ?? true,
|
||||||
AllowAudioStreamCopy = allowAudioStreamCopy ?? true,
|
AllowAudioStreamCopy = allowAudioStreamCopy ?? true,
|
||||||
AllowVideoStreamCopy = allowVideoStreamCopy ?? true,
|
AllowVideoStreamCopy = allowVideoStreamCopy ?? true,
|
||||||
BreakOnNonKeyFrames = breakOnNonKeyFrames ?? false,
|
|
||||||
AudioSampleRate = audioSampleRate,
|
AudioSampleRate = audioSampleRate,
|
||||||
MaxAudioChannels = maxAudioChannels,
|
MaxAudioChannels = maxAudioChannels,
|
||||||
AudioBitRate = audioBitRate,
|
AudioBitRate = audioBitRate,
|
||||||
|
|
@ -511,7 +508,6 @@ public class VideosController : BaseJellyfinApiController
|
||||||
/// <param name="enableAutoStreamCopy">Whether or not to allow automatic stream copy if requested values match the original source. Defaults to true.</param>
|
/// <param name="enableAutoStreamCopy">Whether or not to allow automatic stream copy if requested values match the original source. Defaults to true.</param>
|
||||||
/// <param name="allowVideoStreamCopy">Whether or not to allow copying of the video stream url.</param>
|
/// <param name="allowVideoStreamCopy">Whether or not to allow copying of the video stream url.</param>
|
||||||
/// <param name="allowAudioStreamCopy">Whether or not to allow copying of the audio stream url.</param>
|
/// <param name="allowAudioStreamCopy">Whether or not to allow copying of the audio stream url.</param>
|
||||||
/// <param name="breakOnNonKeyFrames">Optional. Whether to break on non key frames.</param>
|
|
||||||
/// <param name="audioSampleRate">Optional. Specify a specific audio sample rate, e.g. 44100.</param>
|
/// <param name="audioSampleRate">Optional. Specify a specific audio sample rate, e.g. 44100.</param>
|
||||||
/// <param name="maxAudioBitDepth">Optional. The maximum audio bit depth.</param>
|
/// <param name="maxAudioBitDepth">Optional. The maximum audio bit depth.</param>
|
||||||
/// <param name="audioBitRate">Optional. Specify an audio bitrate to encode to, e.g. 128000. If omitted this will be left to encoder defaults.</param>
|
/// <param name="audioBitRate">Optional. Specify an audio bitrate to encode to, e.g. 128000. If omitted this will be left to encoder defaults.</param>
|
||||||
|
|
@ -570,7 +566,6 @@ public class VideosController : BaseJellyfinApiController
|
||||||
[FromQuery] bool? enableAutoStreamCopy,
|
[FromQuery] bool? enableAutoStreamCopy,
|
||||||
[FromQuery] bool? allowVideoStreamCopy,
|
[FromQuery] bool? allowVideoStreamCopy,
|
||||||
[FromQuery] bool? allowAudioStreamCopy,
|
[FromQuery] bool? allowAudioStreamCopy,
|
||||||
[FromQuery] bool? breakOnNonKeyFrames,
|
|
||||||
[FromQuery] int? audioSampleRate,
|
[FromQuery] int? audioSampleRate,
|
||||||
[FromQuery] int? maxAudioBitDepth,
|
[FromQuery] int? maxAudioBitDepth,
|
||||||
[FromQuery] int? audioBitRate,
|
[FromQuery] int? audioBitRate,
|
||||||
|
|
@ -624,7 +619,6 @@ public class VideosController : BaseJellyfinApiController
|
||||||
enableAutoStreamCopy,
|
enableAutoStreamCopy,
|
||||||
allowVideoStreamCopy,
|
allowVideoStreamCopy,
|
||||||
allowAudioStreamCopy,
|
allowAudioStreamCopy,
|
||||||
breakOnNonKeyFrames,
|
|
||||||
audioSampleRate,
|
audioSampleRate,
|
||||||
maxAudioBitDepth,
|
maxAudioBitDepth,
|
||||||
audioBitRate,
|
audioBitRate,
|
||||||
|
|
|
||||||
|
|
@ -201,7 +201,7 @@ public static class StreamingHelpers
|
||||||
state.OutputVideoCodec = state.Request.VideoCodec;
|
state.OutputVideoCodec = state.Request.VideoCodec;
|
||||||
state.OutputVideoBitrate = encodingHelper.GetVideoBitrateParamValue(state.VideoRequest, state.VideoStream, state.OutputVideoCodec);
|
state.OutputVideoBitrate = encodingHelper.GetVideoBitrateParamValue(state.VideoRequest, state.VideoStream, state.OutputVideoCodec);
|
||||||
|
|
||||||
encodingHelper.TryStreamCopy(state);
|
encodingHelper.TryStreamCopy(state, encodingOptions);
|
||||||
|
|
||||||
if (!EncodingHelper.IsCopyCodec(state.OutputVideoCodec) && state.OutputVideoBitrate.HasValue)
|
if (!EncodingHelper.IsCopyCodec(state.OutputVideoCodec) && state.OutputVideoBitrate.HasValue)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -43,8 +43,6 @@ namespace MediaBrowser.Controller.MediaEncoding
|
||||||
|
|
||||||
public bool AllowAudioStreamCopy { get; set; }
|
public bool AllowAudioStreamCopy { get; set; }
|
||||||
|
|
||||||
public bool BreakOnNonKeyFrames { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the audio sample rate.
|
/// Gets or sets the audio sample rate.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
||||||
|
|
@ -2914,8 +2914,8 @@ namespace MediaBrowser.Controller.MediaEncoding
|
||||||
|
|
||||||
if (time > 0)
|
if (time > 0)
|
||||||
{
|
{
|
||||||
// For direct streaming/remuxing, we seek at the exact position of the keyframe
|
// For direct streaming/remuxing, HLS segments start at keyframes.
|
||||||
// However, ffmpeg will seek to previous keyframe when the exact time is the input
|
// However, ffmpeg will seek to previous keyframe when the exact frame time is the input
|
||||||
// Workaround this by adding 0.5s offset to the seeking time to get the exact keyframe on most videos.
|
// Workaround this by adding 0.5s offset to the seeking time to get the exact keyframe on most videos.
|
||||||
// This will help subtitle syncing.
|
// This will help subtitle syncing.
|
||||||
var isHlsRemuxing = state.IsVideoRequest && state.TranscodingType is TranscodingJobType.Hls && IsCopyCodec(state.OutputVideoCodec);
|
var isHlsRemuxing = state.IsVideoRequest && state.TranscodingType is TranscodingJobType.Hls && IsCopyCodec(state.OutputVideoCodec);
|
||||||
|
|
@ -2932,17 +2932,16 @@ namespace MediaBrowser.Controller.MediaEncoding
|
||||||
|
|
||||||
if (state.IsVideoRequest)
|
if (state.IsVideoRequest)
|
||||||
{
|
{
|
||||||
var outputVideoCodec = GetVideoEncoder(state, options);
|
// If we are remuxing, then the copied stream cannot be seeked accurately (it will seek to the nearest
|
||||||
var segmentFormat = GetSegmentFileExtension(segmentContainer).TrimStart('.');
|
// keyframe). If we are using fMP4, then force all other streams to use the same inaccurate seeking to
|
||||||
|
// avoid A/V sync issues which cause playback issues on some devices.
|
||||||
// Important: If this is ever re-enabled, make sure not to use it with wtv because it breaks seeking
|
// When remuxing video, the segment start times correspond to key frames in the source stream, so this
|
||||||
// Disable -noaccurate_seek on mpegts container due to the timestamps issue on some clients,
|
// option shouldn't change the seeked point that much.
|
||||||
// but it's still required for fMP4 container otherwise the audio can't be synced to the video.
|
// Important: make sure not to use it with wtv because it breaks seeking
|
||||||
if (!string.Equals(state.InputContainer, "wtv", StringComparison.OrdinalIgnoreCase)
|
if (state.TranscodingType is TranscodingJobType.Hls
|
||||||
&& !string.Equals(segmentFormat, "ts", StringComparison.OrdinalIgnoreCase)
|
&& string.Equals(segmentContainer, "mp4", StringComparison.OrdinalIgnoreCase)
|
||||||
&& state.TranscodingType != TranscodingJobType.Progressive
|
&& (IsCopyCodec(state.OutputVideoCodec) || IsCopyCodec(state.OutputAudioCodec))
|
||||||
&& !state.EnableBreakOnNonKeyFrames(outputVideoCodec)
|
&& !string.Equals(state.InputContainer, "wtv", StringComparison.OrdinalIgnoreCase))
|
||||||
&& (state.BaseRequest.StartTimeTicks ?? 0) > 0)
|
|
||||||
{
|
{
|
||||||
seekParam += " -noaccurate_seek";
|
seekParam += " -noaccurate_seek";
|
||||||
}
|
}
|
||||||
|
|
@ -7084,7 +7083,7 @@ namespace MediaBrowser.Controller.MediaEncoding
|
||||||
}
|
}
|
||||||
|
|
||||||
#nullable disable
|
#nullable disable
|
||||||
public void TryStreamCopy(EncodingJobInfo state)
|
public void TryStreamCopy(EncodingJobInfo state, EncodingOptions options)
|
||||||
{
|
{
|
||||||
if (state.VideoStream is not null && CanStreamCopyVideo(state, state.VideoStream))
|
if (state.VideoStream is not null && CanStreamCopyVideo(state, state.VideoStream))
|
||||||
{
|
{
|
||||||
|
|
@ -7101,8 +7100,14 @@ namespace MediaBrowser.Controller.MediaEncoding
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var preventHlsAudioCopy = state.TranscodingType is TranscodingJobType.Hls
|
||||||
|
&& state.VideoStream is not null
|
||||||
|
&& !IsCopyCodec(state.OutputVideoCodec)
|
||||||
|
&& options.HlsAudioSeekStrategy is HlsAudioSeekStrategy.TranscodeAudio;
|
||||||
|
|
||||||
if (state.AudioStream is not null
|
if (state.AudioStream is not null
|
||||||
&& CanStreamCopyAudio(state, state.AudioStream, state.SupportedAudioCodecs))
|
&& CanStreamCopyAudio(state, state.AudioStream, state.SupportedAudioCodecs)
|
||||||
|
&& !preventHlsAudioCopy)
|
||||||
{
|
{
|
||||||
state.OutputAudioCodec = "copy";
|
state.OutputAudioCodec = "copy";
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -515,21 +515,6 @@ namespace MediaBrowser.Controller.MediaEncoding
|
||||||
|
|
||||||
public int HlsListSize => 0;
|
public int HlsListSize => 0;
|
||||||
|
|
||||||
public bool EnableBreakOnNonKeyFrames(string videoCodec)
|
|
||||||
{
|
|
||||||
if (TranscodingType != TranscodingJobType.Progressive)
|
|
||||||
{
|
|
||||||
if (IsSegmentedLiveStream)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return BaseRequest.BreakOnNonKeyFrames && EncodingHelper.IsCopyCodec(videoCodec);
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
private int? GetMediaStreamCount(MediaStreamType type, int limit)
|
private int? GetMediaStreamCount(MediaStreamType type, int limit)
|
||||||
{
|
{
|
||||||
var count = MediaSource.GetStreamCount(type);
|
var count = MediaSource.GetStreamCount(type);
|
||||||
|
|
|
||||||
|
|
@ -673,7 +673,7 @@ public sealed class TranscodeManager : ITranscodeManager, IDisposable
|
||||||
|
|
||||||
if (state.VideoRequest is not null)
|
if (state.VideoRequest is not null)
|
||||||
{
|
{
|
||||||
_encodingHelper.TryStreamCopy(state);
|
_encodingHelper.TryStreamCopy(state, encodingOptions);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
#pragma warning disable CA1819 // XML serialization handles collections improperly, so we need to use arrays
|
#pragma warning disable CA1819 // XML serialization handles collections improperly, so we need to use arrays
|
||||||
|
|
||||||
#nullable disable
|
#nullable disable
|
||||||
|
using System.ComponentModel;
|
||||||
using MediaBrowser.Model.Entities;
|
using MediaBrowser.Model.Entities;
|
||||||
|
|
||||||
namespace MediaBrowser.Model.Configuration;
|
namespace MediaBrowser.Model.Configuration;
|
||||||
|
|
@ -60,6 +61,7 @@ public class EncodingOptions
|
||||||
SubtitleExtractionTimeoutMinutes = 30;
|
SubtitleExtractionTimeoutMinutes = 30;
|
||||||
AllowOnDemandMetadataBasedKeyframeExtractionForExtensions = ["mkv"];
|
AllowOnDemandMetadataBasedKeyframeExtractionForExtensions = ["mkv"];
|
||||||
HardwareDecodingCodecs = ["h264", "vc1"];
|
HardwareDecodingCodecs = ["h264", "vc1"];
|
||||||
|
HlsAudioSeekStrategy = HlsAudioSeekStrategy.DisableAccurateSeek;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
@ -301,4 +303,10 @@ public class EncodingOptions
|
||||||
/// Gets or sets the file extensions on-demand metadata based keyframe extraction is enabled for.
|
/// Gets or sets the file extensions on-demand metadata based keyframe extraction is enabled for.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string[] AllowOnDemandMetadataBasedKeyframeExtractionForExtensions { get; set; }
|
public string[] AllowOnDemandMetadataBasedKeyframeExtractionForExtensions { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the method used for audio seeking in HLS.
|
||||||
|
/// </summary>
|
||||||
|
[DefaultValue(HlsAudioSeekStrategy.DisableAccurateSeek)]
|
||||||
|
public HlsAudioSeekStrategy HlsAudioSeekStrategy { get; set; }
|
||||||
}
|
}
|
||||||
|
|
|
||||||
23
MediaBrowser.Model/Configuration/HlsAudioSeekStrategy.cs
Normal file
23
MediaBrowser.Model/Configuration/HlsAudioSeekStrategy.cs
Normal file
|
|
@ -0,0 +1,23 @@
|
||||||
|
namespace MediaBrowser.Model.Configuration
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// An enum representing the options to seek the input audio stream when
|
||||||
|
/// transcoding HLS segments.
|
||||||
|
/// </summary>
|
||||||
|
public enum HlsAudioSeekStrategy
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// If the video stream is transcoded and the audio stream is copied,
|
||||||
|
/// seek the video stream to the same keyframe as the audio stream. The
|
||||||
|
/// resulting timestamps in the output streams may be inaccurate.
|
||||||
|
/// </summary>
|
||||||
|
DisableAccurateSeek = 0,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Prevent audio streams from being copied if the video stream is transcoded.
|
||||||
|
/// The resulting timestamps will be accurate, but additional audio transcoding
|
||||||
|
/// overhead will be incurred.
|
||||||
|
/// </summary>
|
||||||
|
TranscodeAudio = 1,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -610,7 +610,6 @@ namespace MediaBrowser.Model.Dlna
|
||||||
playlistItem.EnableSubtitlesInManifest = transcodingProfile.EnableSubtitlesInManifest;
|
playlistItem.EnableSubtitlesInManifest = transcodingProfile.EnableSubtitlesInManifest;
|
||||||
playlistItem.EnableMpegtsM2TsMode = transcodingProfile.EnableMpegtsM2TsMode;
|
playlistItem.EnableMpegtsM2TsMode = transcodingProfile.EnableMpegtsM2TsMode;
|
||||||
|
|
||||||
playlistItem.BreakOnNonKeyFrames = transcodingProfile.BreakOnNonKeyFrames;
|
|
||||||
playlistItem.EnableAudioVbrEncoding = transcodingProfile.EnableAudioVbrEncoding;
|
playlistItem.EnableAudioVbrEncoding = transcodingProfile.EnableAudioVbrEncoding;
|
||||||
|
|
||||||
if (transcodingProfile.MinSegments > 0)
|
if (transcodingProfile.MinSegments > 0)
|
||||||
|
|
|
||||||
|
|
@ -86,11 +86,6 @@ public class StreamInfo
|
||||||
/// <value>The minimum segments count.</value>
|
/// <value>The minimum segments count.</value>
|
||||||
public int? MinSegments { get; set; }
|
public int? MinSegments { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets or sets a value indicating whether the stream can be broken on non-keyframes.
|
|
||||||
/// </summary>
|
|
||||||
public bool BreakOnNonKeyFrames { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets a value indicating whether the stream requires AVC.
|
/// Gets or sets a value indicating whether the stream requires AVC.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
@ -1018,9 +1013,6 @@ public class StreamInfo
|
||||||
sb.Append("&MinSegments=");
|
sb.Append("&MinSegments=");
|
||||||
sb.Append(MinSegments.Value.ToString(CultureInfo.InvariantCulture));
|
sb.Append(MinSegments.Value.ToString(CultureInfo.InvariantCulture));
|
||||||
}
|
}
|
||||||
|
|
||||||
sb.Append("&BreakOnNonKeyFrames=");
|
|
||||||
sb.Append(BreakOnNonKeyFrames.ToString(CultureInfo.InvariantCulture));
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -41,7 +41,6 @@ public class TranscodingProfile
|
||||||
MaxAudioChannels = other.MaxAudioChannels;
|
MaxAudioChannels = other.MaxAudioChannels;
|
||||||
MinSegments = other.MinSegments;
|
MinSegments = other.MinSegments;
|
||||||
SegmentLength = other.SegmentLength;
|
SegmentLength = other.SegmentLength;
|
||||||
BreakOnNonKeyFrames = other.BreakOnNonKeyFrames;
|
|
||||||
Conditions = other.Conditions;
|
Conditions = other.Conditions;
|
||||||
EnableAudioVbrEncoding = other.EnableAudioVbrEncoding;
|
EnableAudioVbrEncoding = other.EnableAudioVbrEncoding;
|
||||||
}
|
}
|
||||||
|
|
@ -143,7 +142,8 @@ public class TranscodingProfile
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[DefaultValue(false)]
|
[DefaultValue(false)]
|
||||||
[XmlAttribute("breakOnNonKeyFrames")]
|
[XmlAttribute("breakOnNonKeyFrames")]
|
||||||
public bool BreakOnNonKeyFrames { get; set; }
|
[Obsolete("This is always false")]
|
||||||
|
public bool? BreakOnNonKeyFrames { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the profile conditions.
|
/// Gets or sets the profile conditions.
|
||||||
|
|
|
||||||
|
|
@ -134,8 +134,6 @@ public class LegacyStreamInfo : StreamInfo
|
||||||
{
|
{
|
||||||
list.Add(new NameValuePair("MinSegments", item.MinSegments.Value.ToString(CultureInfo.InvariantCulture)));
|
list.Add(new NameValuePair("MinSegments", item.MinSegments.Value.ToString(CultureInfo.InvariantCulture)));
|
||||||
}
|
}
|
||||||
|
|
||||||
list.Add(new NameValuePair("BreakOnNonKeyFrames", item.BreakOnNonKeyFrames.ToString(CultureInfo.InvariantCulture)));
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -152,7 +152,6 @@
|
||||||
"EnableSubtitlesInManifest": false,
|
"EnableSubtitlesInManifest": false,
|
||||||
"MinSegments": 0,
|
"MinSegments": 0,
|
||||||
"SegmentLength": 0,
|
"SegmentLength": 0,
|
||||||
"BreakOnNonKeyFrames": false,
|
|
||||||
"$type": "TranscodingProfile"
|
"$type": "TranscodingProfile"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -169,7 +168,6 @@
|
||||||
"EnableSubtitlesInManifest": false,
|
"EnableSubtitlesInManifest": false,
|
||||||
"MinSegments": 0,
|
"MinSegments": 0,
|
||||||
"SegmentLength": 0,
|
"SegmentLength": 0,
|
||||||
"BreakOnNonKeyFrames": false,
|
|
||||||
"$type": "TranscodingProfile"
|
"$type": "TranscodingProfile"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -185,7 +183,6 @@
|
||||||
"EnableSubtitlesInManifest": false,
|
"EnableSubtitlesInManifest": false,
|
||||||
"MinSegments": 0,
|
"MinSegments": 0,
|
||||||
"SegmentLength": 0,
|
"SegmentLength": 0,
|
||||||
"BreakOnNonKeyFrames": false,
|
|
||||||
"$type": "TranscodingProfile"
|
"$type": "TranscodingProfile"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|
|
||||||
|
|
@ -130,7 +130,6 @@
|
||||||
"EnableSubtitlesInManifest": false,
|
"EnableSubtitlesInManifest": false,
|
||||||
"MinSegments": 0,
|
"MinSegments": 0,
|
||||||
"SegmentLength": 0,
|
"SegmentLength": 0,
|
||||||
"BreakOnNonKeyFrames": false,
|
|
||||||
"$type": "TranscodingProfile"
|
"$type": "TranscodingProfile"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -146,7 +145,6 @@
|
||||||
"EnableSubtitlesInManifest": false,
|
"EnableSubtitlesInManifest": false,
|
||||||
"MinSegments": 0,
|
"MinSegments": 0,
|
||||||
"SegmentLength": 0,
|
"SegmentLength": 0,
|
||||||
"BreakOnNonKeyFrames": false,
|
|
||||||
"$type": "TranscodingProfile"
|
"$type": "TranscodingProfile"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|
|
||||||
|
|
@ -127,7 +127,6 @@
|
||||||
"MaxAudioChannels": "6",
|
"MaxAudioChannels": "6",
|
||||||
"MinSegments": 0,
|
"MinSegments": 0,
|
||||||
"SegmentLength": 0,
|
"SegmentLength": 0,
|
||||||
"BreakOnNonKeyFrames": false,
|
|
||||||
"$type": "TranscodingProfile"
|
"$type": "TranscodingProfile"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -144,7 +143,6 @@
|
||||||
"MaxAudioChannels": "6",
|
"MaxAudioChannels": "6",
|
||||||
"MinSegments": 0,
|
"MinSegments": 0,
|
||||||
"SegmentLength": 0,
|
"SegmentLength": 0,
|
||||||
"BreakOnNonKeyFrames": false,
|
|
||||||
"$type": "TranscodingProfile"
|
"$type": "TranscodingProfile"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -161,7 +159,6 @@
|
||||||
"MaxAudioChannels": "6",
|
"MaxAudioChannels": "6",
|
||||||
"MinSegments": 0,
|
"MinSegments": 0,
|
||||||
"SegmentLength": 0,
|
"SegmentLength": 0,
|
||||||
"BreakOnNonKeyFrames": false,
|
|
||||||
"$type": "TranscodingProfile"
|
"$type": "TranscodingProfile"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -178,7 +175,6 @@
|
||||||
"MaxAudioChannels": "6",
|
"MaxAudioChannels": "6",
|
||||||
"MinSegments": 0,
|
"MinSegments": 0,
|
||||||
"SegmentLength": 0,
|
"SegmentLength": 0,
|
||||||
"BreakOnNonKeyFrames": false,
|
|
||||||
"$type": "TranscodingProfile"
|
"$type": "TranscodingProfile"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -195,7 +191,6 @@
|
||||||
"MaxAudioChannels": "6",
|
"MaxAudioChannels": "6",
|
||||||
"MinSegments": 0,
|
"MinSegments": 0,
|
||||||
"SegmentLength": 0,
|
"SegmentLength": 0,
|
||||||
"BreakOnNonKeyFrames": false,
|
|
||||||
"$type": "TranscodingProfile"
|
"$type": "TranscodingProfile"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -212,7 +207,6 @@
|
||||||
"MaxAudioChannels": "6",
|
"MaxAudioChannels": "6",
|
||||||
"MinSegments": 0,
|
"MinSegments": 0,
|
||||||
"SegmentLength": 0,
|
"SegmentLength": 0,
|
||||||
"BreakOnNonKeyFrames": false,
|
|
||||||
"$type": "TranscodingProfile"
|
"$type": "TranscodingProfile"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -229,7 +223,6 @@
|
||||||
"MaxAudioChannels": "6",
|
"MaxAudioChannels": "6",
|
||||||
"MinSegments": 0,
|
"MinSegments": 0,
|
||||||
"SegmentLength": 0,
|
"SegmentLength": 0,
|
||||||
"BreakOnNonKeyFrames": false,
|
|
||||||
"$type": "TranscodingProfile"
|
"$type": "TranscodingProfile"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -246,7 +239,6 @@
|
||||||
"MaxAudioChannels": "6",
|
"MaxAudioChannels": "6",
|
||||||
"MinSegments": 0,
|
"MinSegments": 0,
|
||||||
"SegmentLength": 0,
|
"SegmentLength": 0,
|
||||||
"BreakOnNonKeyFrames": false,
|
|
||||||
"$type": "TranscodingProfile"
|
"$type": "TranscodingProfile"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -263,7 +255,6 @@
|
||||||
"EnableSubtitlesInManifest": false,
|
"EnableSubtitlesInManifest": false,
|
||||||
"MinSegments": 0,
|
"MinSegments": 0,
|
||||||
"SegmentLength": 0,
|
"SegmentLength": 0,
|
||||||
"BreakOnNonKeyFrames": false,
|
|
||||||
"$type": "TranscodingProfile"
|
"$type": "TranscodingProfile"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -281,7 +272,6 @@
|
||||||
"MaxAudioChannels": "6",
|
"MaxAudioChannels": "6",
|
||||||
"MinSegments": 0,
|
"MinSegments": 0,
|
||||||
"SegmentLength": 0,
|
"SegmentLength": 0,
|
||||||
"BreakOnNonKeyFrames": false,
|
|
||||||
"$type": "TranscodingProfile"
|
"$type": "TranscodingProfile"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -298,7 +288,6 @@
|
||||||
"EnableSubtitlesInManifest": false,
|
"EnableSubtitlesInManifest": false,
|
||||||
"MinSegments": 0,
|
"MinSegments": 0,
|
||||||
"SegmentLength": 0,
|
"SegmentLength": 0,
|
||||||
"BreakOnNonKeyFrames": false,
|
|
||||||
"$type": "TranscodingProfile"
|
"$type": "TranscodingProfile"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|
|
||||||
|
|
@ -107,7 +107,6 @@
|
||||||
"Protocol": "hls",
|
"Protocol": "hls",
|
||||||
"MaxAudioChannels": "2",
|
"MaxAudioChannels": "2",
|
||||||
"MinSegments": "2",
|
"MinSegments": "2",
|
||||||
"BreakOnNonKeyFrames": true,
|
|
||||||
"EnableAudioVbrEncoding": true
|
"EnableAudioVbrEncoding": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -182,8 +181,7 @@
|
||||||
"Context": "Streaming",
|
"Context": "Streaming",
|
||||||
"Protocol": "hls",
|
"Protocol": "hls",
|
||||||
"MaxAudioChannels": "2",
|
"MaxAudioChannels": "2",
|
||||||
"MinSegments": "2",
|
"MinSegments": "2"
|
||||||
"BreakOnNonKeyFrames": true
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Container": "ts",
|
"Container": "ts",
|
||||||
|
|
@ -193,8 +191,7 @@
|
||||||
"Context": "Streaming",
|
"Context": "Streaming",
|
||||||
"Protocol": "hls",
|
"Protocol": "hls",
|
||||||
"MaxAudioChannels": "2",
|
"MaxAudioChannels": "2",
|
||||||
"MinSegments": "2",
|
"MinSegments": "2"
|
||||||
"BreakOnNonKeyFrames": true
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"ContainerProfiles": [],
|
"ContainerProfiles": [],
|
||||||
|
|
|
||||||
|
|
@ -95,7 +95,6 @@
|
||||||
"TranscodingProfiles": [
|
"TranscodingProfiles": [
|
||||||
{
|
{
|
||||||
"AudioCodec": "aac",
|
"AudioCodec": "aac",
|
||||||
"BreakOnNonKeyFrames": true,
|
|
||||||
"Container": "mp4",
|
"Container": "mp4",
|
||||||
"Context": "Streaming",
|
"Context": "Streaming",
|
||||||
"EnableAudioVbrEncoding": true,
|
"EnableAudioVbrEncoding": true,
|
||||||
|
|
@ -170,7 +169,6 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"AudioCodec": "aac,mp2,opus,flac",
|
"AudioCodec": "aac,mp2,opus,flac",
|
||||||
"BreakOnNonKeyFrames": true,
|
|
||||||
"Container": "mp4",
|
"Container": "mp4",
|
||||||
"Context": "Streaming",
|
"Context": "Streaming",
|
||||||
"MaxAudioChannels": "2",
|
"MaxAudioChannels": "2",
|
||||||
|
|
@ -181,7 +179,6 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"AudioCodec": "aac,mp3,mp2",
|
"AudioCodec": "aac,mp3,mp2",
|
||||||
"BreakOnNonKeyFrames": true,
|
|
||||||
"Container": "ts",
|
"Container": "ts",
|
||||||
"Context": "Streaming",
|
"Context": "Streaming",
|
||||||
"MaxAudioChannels": "2",
|
"MaxAudioChannels": "2",
|
||||||
|
|
|
||||||
|
|
@ -30,7 +30,6 @@
|
||||||
"EnableSubtitlesInManifest": false,
|
"EnableSubtitlesInManifest": false,
|
||||||
"MinSegments": 0,
|
"MinSegments": 0,
|
||||||
"SegmentLength": 0,
|
"SegmentLength": 0,
|
||||||
"BreakOnNonKeyFrames": false,
|
|
||||||
"$type": "TranscodingProfile"
|
"$type": "TranscodingProfile"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -48,7 +47,6 @@
|
||||||
"MaxAudioChannels": "6",
|
"MaxAudioChannels": "6",
|
||||||
"MinSegments": 0,
|
"MinSegments": 0,
|
||||||
"SegmentLength": 0,
|
"SegmentLength": 0,
|
||||||
"BreakOnNonKeyFrames": false,
|
|
||||||
"$type": "TranscodingProfile"
|
"$type": "TranscodingProfile"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -62,7 +60,6 @@
|
||||||
"EnableSubtitlesInManifest": false,
|
"EnableSubtitlesInManifest": false,
|
||||||
"MinSegments": 0,
|
"MinSegments": 0,
|
||||||
"SegmentLength": 0,
|
"SegmentLength": 0,
|
||||||
"BreakOnNonKeyFrames": false,
|
|
||||||
"$type": "TranscodingProfile"
|
"$type": "TranscodingProfile"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|
|
||||||
|
|
@ -30,7 +30,6 @@
|
||||||
"EnableSubtitlesInManifest": false,
|
"EnableSubtitlesInManifest": false,
|
||||||
"MinSegments": 0,
|
"MinSegments": 0,
|
||||||
"SegmentLength": 0,
|
"SegmentLength": 0,
|
||||||
"BreakOnNonKeyFrames": false,
|
|
||||||
"$type": "TranscodingProfile"
|
"$type": "TranscodingProfile"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -48,7 +47,6 @@
|
||||||
"MaxAudioChannels": "6",
|
"MaxAudioChannels": "6",
|
||||||
"MinSegments": 0,
|
"MinSegments": 0,
|
||||||
"SegmentLength": 0,
|
"SegmentLength": 0,
|
||||||
"BreakOnNonKeyFrames": false,
|
|
||||||
"$type": "TranscodingProfile"
|
"$type": "TranscodingProfile"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -62,7 +60,6 @@
|
||||||
"EnableSubtitlesInManifest": false,
|
"EnableSubtitlesInManifest": false,
|
||||||
"MinSegments": 0,
|
"MinSegments": 0,
|
||||||
"SegmentLength": 0,
|
"SegmentLength": 0,
|
||||||
"BreakOnNonKeyFrames": false,
|
|
||||||
"$type": "TranscodingProfile"
|
"$type": "TranscodingProfile"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|
|
||||||
|
|
@ -49,7 +49,6 @@
|
||||||
"MaxAudioChannels": " 2",
|
"MaxAudioChannels": " 2",
|
||||||
"MinSegments": 0,
|
"MinSegments": 0,
|
||||||
"SegmentLength": 0,
|
"SegmentLength": 0,
|
||||||
"BreakOnNonKeyFrames": false,
|
|
||||||
"$type": "TranscodingProfile"
|
"$type": "TranscodingProfile"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -66,7 +65,6 @@
|
||||||
"MaxAudioChannels": "2",
|
"MaxAudioChannels": "2",
|
||||||
"MinSegments": 0,
|
"MinSegments": 0,
|
||||||
"SegmentLength": 0,
|
"SegmentLength": 0,
|
||||||
"BreakOnNonKeyFrames": false,
|
|
||||||
"$type": "TranscodingProfile"
|
"$type": "TranscodingProfile"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -83,7 +81,6 @@
|
||||||
"MaxAudioChannels": "2",
|
"MaxAudioChannels": "2",
|
||||||
"MinSegments": 0,
|
"MinSegments": 0,
|
||||||
"SegmentLength": 0,
|
"SegmentLength": 0,
|
||||||
"BreakOnNonKeyFrames": false,
|
|
||||||
"$type": "TranscodingProfile"
|
"$type": "TranscodingProfile"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -100,7 +97,6 @@
|
||||||
"MaxAudioChannels": " 2",
|
"MaxAudioChannels": " 2",
|
||||||
"MinSegments": 0,
|
"MinSegments": 0,
|
||||||
"SegmentLength": 0,
|
"SegmentLength": 0,
|
||||||
"BreakOnNonKeyFrames": false,
|
|
||||||
"$type": "TranscodingProfile"
|
"$type": "TranscodingProfile"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -118,7 +114,6 @@
|
||||||
"MaxAudioChannels": " 2",
|
"MaxAudioChannels": " 2",
|
||||||
"MinSegments": 1,
|
"MinSegments": 1,
|
||||||
"SegmentLength": 0,
|
"SegmentLength": 0,
|
||||||
"BreakOnNonKeyFrames": false,
|
|
||||||
"$type": "TranscodingProfile"
|
"$type": "TranscodingProfile"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -135,7 +130,6 @@
|
||||||
"EnableSubtitlesInManifest": false,
|
"EnableSubtitlesInManifest": false,
|
||||||
"MinSegments": 0,
|
"MinSegments": 0,
|
||||||
"SegmentLength": 0,
|
"SegmentLength": 0,
|
||||||
"BreakOnNonKeyFrames": false,
|
|
||||||
"$type": "TranscodingProfile"
|
"$type": "TranscodingProfile"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|
|
||||||
|
|
@ -49,7 +49,6 @@
|
||||||
"MaxAudioChannels": " 2",
|
"MaxAudioChannels": " 2",
|
||||||
"MinSegments": 0,
|
"MinSegments": 0,
|
||||||
"SegmentLength": 0,
|
"SegmentLength": 0,
|
||||||
"BreakOnNonKeyFrames": false,
|
|
||||||
"$type": "TranscodingProfile"
|
"$type": "TranscodingProfile"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -66,7 +65,6 @@
|
||||||
"MaxAudioChannels": "2",
|
"MaxAudioChannels": "2",
|
||||||
"MinSegments": 0,
|
"MinSegments": 0,
|
||||||
"SegmentLength": 0,
|
"SegmentLength": 0,
|
||||||
"BreakOnNonKeyFrames": false,
|
|
||||||
"$type": "TranscodingProfile"
|
"$type": "TranscodingProfile"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -83,7 +81,6 @@
|
||||||
"MaxAudioChannels": "2",
|
"MaxAudioChannels": "2",
|
||||||
"MinSegments": 0,
|
"MinSegments": 0,
|
||||||
"SegmentLength": 0,
|
"SegmentLength": 0,
|
||||||
"BreakOnNonKeyFrames": false,
|
|
||||||
"$type": "TranscodingProfile"
|
"$type": "TranscodingProfile"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -100,7 +97,6 @@
|
||||||
"MaxAudioChannels": " 2",
|
"MaxAudioChannels": " 2",
|
||||||
"MinSegments": 0,
|
"MinSegments": 0,
|
||||||
"SegmentLength": 0,
|
"SegmentLength": 0,
|
||||||
"BreakOnNonKeyFrames": false,
|
|
||||||
"$type": "TranscodingProfile"
|
"$type": "TranscodingProfile"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -118,7 +114,6 @@
|
||||||
"MaxAudioChannels": " 2",
|
"MaxAudioChannels": " 2",
|
||||||
"MinSegments": 1,
|
"MinSegments": 1,
|
||||||
"SegmentLength": 0,
|
"SegmentLength": 0,
|
||||||
"BreakOnNonKeyFrames": false,
|
|
||||||
"$type": "TranscodingProfile"
|
"$type": "TranscodingProfile"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -135,7 +130,6 @@
|
||||||
"EnableSubtitlesInManifest": false,
|
"EnableSubtitlesInManifest": false,
|
||||||
"MinSegments": 0,
|
"MinSegments": 0,
|
||||||
"SegmentLength": 0,
|
"SegmentLength": 0,
|
||||||
"BreakOnNonKeyFrames": false,
|
|
||||||
"$type": "TranscodingProfile"
|
"$type": "TranscodingProfile"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|
|
||||||
|
|
@ -114,7 +114,6 @@
|
||||||
"Protocol": "hls",
|
"Protocol": "hls",
|
||||||
"MaxAudioChannels": "6",
|
"MaxAudioChannels": "6",
|
||||||
"MinSegments": "2",
|
"MinSegments": "2",
|
||||||
"BreakOnNonKeyFrames": true,
|
|
||||||
"EnableAudioVbrEncoding": true
|
"EnableAudioVbrEncoding": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -173,8 +172,7 @@
|
||||||
"Context": "Streaming",
|
"Context": "Streaming",
|
||||||
"Protocol": "hls",
|
"Protocol": "hls",
|
||||||
"MaxAudioChannels": "2",
|
"MaxAudioChannels": "2",
|
||||||
"MinSegments": "2",
|
"MinSegments": "2"
|
||||||
"BreakOnNonKeyFrames": true
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Container": "ts",
|
"Container": "ts",
|
||||||
|
|
@ -184,8 +182,7 @@
|
||||||
"Context": "Streaming",
|
"Context": "Streaming",
|
||||||
"Protocol": "hls",
|
"Protocol": "hls",
|
||||||
"MaxAudioChannels": "2",
|
"MaxAudioChannels": "2",
|
||||||
"MinSegments": "2",
|
"MinSegments": "2"
|
||||||
"BreakOnNonKeyFrames": true
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"ContainerProfiles": [],
|
"ContainerProfiles": [],
|
||||||
|
|
|
||||||
|
|
@ -165,7 +165,6 @@
|
||||||
"MaxAudioChannels": "2",
|
"MaxAudioChannels": "2",
|
||||||
"MinSegments": 1,
|
"MinSegments": 1,
|
||||||
"SegmentLength": 0,
|
"SegmentLength": 0,
|
||||||
"BreakOnNonKeyFrames": true,
|
|
||||||
"$type": "TranscodingProfile"
|
"$type": "TranscodingProfile"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -182,7 +181,6 @@
|
||||||
"MaxAudioChannels": "2",
|
"MaxAudioChannels": "2",
|
||||||
"MinSegments": 0,
|
"MinSegments": 0,
|
||||||
"SegmentLength": 0,
|
"SegmentLength": 0,
|
||||||
"BreakOnNonKeyFrames": false,
|
|
||||||
"$type": "TranscodingProfile"
|
"$type": "TranscodingProfile"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -199,7 +197,6 @@
|
||||||
"MaxAudioChannels": "2",
|
"MaxAudioChannels": "2",
|
||||||
"MinSegments": 0,
|
"MinSegments": 0,
|
||||||
"SegmentLength": 0,
|
"SegmentLength": 0,
|
||||||
"BreakOnNonKeyFrames": false,
|
|
||||||
"$type": "TranscodingProfile"
|
"$type": "TranscodingProfile"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -216,7 +213,6 @@
|
||||||
"MaxAudioChannels": "2",
|
"MaxAudioChannels": "2",
|
||||||
"MinSegments": 0,
|
"MinSegments": 0,
|
||||||
"SegmentLength": 0,
|
"SegmentLength": 0,
|
||||||
"BreakOnNonKeyFrames": false,
|
|
||||||
"$type": "TranscodingProfile"
|
"$type": "TranscodingProfile"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -233,7 +229,6 @@
|
||||||
"MaxAudioChannels": "2",
|
"MaxAudioChannels": "2",
|
||||||
"MinSegments": 0,
|
"MinSegments": 0,
|
||||||
"SegmentLength": 0,
|
"SegmentLength": 0,
|
||||||
"BreakOnNonKeyFrames": false,
|
|
||||||
"$type": "TranscodingProfile"
|
"$type": "TranscodingProfile"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -250,7 +245,6 @@
|
||||||
"MaxAudioChannels": "2",
|
"MaxAudioChannels": "2",
|
||||||
"MinSegments": 0,
|
"MinSegments": 0,
|
||||||
"SegmentLength": 0,
|
"SegmentLength": 0,
|
||||||
"BreakOnNonKeyFrames": false,
|
|
||||||
"$type": "TranscodingProfile"
|
"$type": "TranscodingProfile"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -267,7 +261,6 @@
|
||||||
"MaxAudioChannels": "2",
|
"MaxAudioChannels": "2",
|
||||||
"MinSegments": 0,
|
"MinSegments": 0,
|
||||||
"SegmentLength": 0,
|
"SegmentLength": 0,
|
||||||
"BreakOnNonKeyFrames": false,
|
|
||||||
"$type": "TranscodingProfile"
|
"$type": "TranscodingProfile"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -284,7 +277,6 @@
|
||||||
"MaxAudioChannels": "2",
|
"MaxAudioChannels": "2",
|
||||||
"MinSegments": 0,
|
"MinSegments": 0,
|
||||||
"SegmentLength": 0,
|
"SegmentLength": 0,
|
||||||
"BreakOnNonKeyFrames": false,
|
|
||||||
"$type": "TranscodingProfile"
|
"$type": "TranscodingProfile"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -301,7 +293,6 @@
|
||||||
"MaxAudioChannels": "2",
|
"MaxAudioChannels": "2",
|
||||||
"MinSegments": 0,
|
"MinSegments": 0,
|
||||||
"SegmentLength": 0,
|
"SegmentLength": 0,
|
||||||
"BreakOnNonKeyFrames": false,
|
|
||||||
"$type": "TranscodingProfile"
|
"$type": "TranscodingProfile"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -319,7 +310,6 @@
|
||||||
"MaxAudioChannels": "2",
|
"MaxAudioChannels": "2",
|
||||||
"MinSegments": 0,
|
"MinSegments": 0,
|
||||||
"SegmentLength": 0,
|
"SegmentLength": 0,
|
||||||
"BreakOnNonKeyFrames": false,
|
|
||||||
"Conditions": [
|
"Conditions": [
|
||||||
{
|
{
|
||||||
"Condition": "LessThanEqual",
|
"Condition": "LessThanEqual",
|
||||||
|
|
@ -346,7 +336,6 @@
|
||||||
"MaxAudioChannels": "2",
|
"MaxAudioChannels": "2",
|
||||||
"MinSegments": 1,
|
"MinSegments": 1,
|
||||||
"SegmentLength": 0,
|
"SegmentLength": 0,
|
||||||
"BreakOnNonKeyFrames": false,
|
|
||||||
"Conditions": [
|
"Conditions": [
|
||||||
{
|
{
|
||||||
"Condition": "LessThanEqual",
|
"Condition": "LessThanEqual",
|
||||||
|
|
@ -373,7 +362,6 @@
|
||||||
"MaxAudioChannels": "2",
|
"MaxAudioChannels": "2",
|
||||||
"MinSegments": 0,
|
"MinSegments": 0,
|
||||||
"SegmentLength": 0,
|
"SegmentLength": 0,
|
||||||
"BreakOnNonKeyFrames": false,
|
|
||||||
"Conditions": [
|
"Conditions": [
|
||||||
{
|
{
|
||||||
"Condition": "LessThanEqual",
|
"Condition": "LessThanEqual",
|
||||||
|
|
@ -399,7 +387,6 @@
|
||||||
"EnableSubtitlesInManifest": false,
|
"EnableSubtitlesInManifest": false,
|
||||||
"MinSegments": 0,
|
"MinSegments": 0,
|
||||||
"SegmentLength": 0,
|
"SegmentLength": 0,
|
||||||
"BreakOnNonKeyFrames": false,
|
|
||||||
"Conditions": [
|
"Conditions": [
|
||||||
{
|
{
|
||||||
"Condition": "LessThanEqual",
|
"Condition": "LessThanEqual",
|
||||||
|
|
|
||||||
|
|
@ -165,7 +165,6 @@
|
||||||
"MaxAudioChannels": "6",
|
"MaxAudioChannels": "6",
|
||||||
"MinSegments": 1,
|
"MinSegments": 1,
|
||||||
"SegmentLength": 0,
|
"SegmentLength": 0,
|
||||||
"BreakOnNonKeyFrames": true,
|
|
||||||
"$type": "TranscodingProfile"
|
"$type": "TranscodingProfile"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -182,7 +181,6 @@
|
||||||
"MaxAudioChannels": "6",
|
"MaxAudioChannels": "6",
|
||||||
"MinSegments": 0,
|
"MinSegments": 0,
|
||||||
"SegmentLength": 0,
|
"SegmentLength": 0,
|
||||||
"BreakOnNonKeyFrames": false,
|
|
||||||
"$type": "TranscodingProfile"
|
"$type": "TranscodingProfile"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -199,7 +197,6 @@
|
||||||
"MaxAudioChannels": "6",
|
"MaxAudioChannels": "6",
|
||||||
"MinSegments": 0,
|
"MinSegments": 0,
|
||||||
"SegmentLength": 0,
|
"SegmentLength": 0,
|
||||||
"BreakOnNonKeyFrames": false,
|
|
||||||
"$type": "TranscodingProfile"
|
"$type": "TranscodingProfile"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -216,7 +213,6 @@
|
||||||
"MaxAudioChannels": "6",
|
"MaxAudioChannels": "6",
|
||||||
"MinSegments": 0,
|
"MinSegments": 0,
|
||||||
"SegmentLength": 0,
|
"SegmentLength": 0,
|
||||||
"BreakOnNonKeyFrames": false,
|
|
||||||
"$type": "TranscodingProfile"
|
"$type": "TranscodingProfile"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -233,7 +229,6 @@
|
||||||
"MaxAudioChannels": "6",
|
"MaxAudioChannels": "6",
|
||||||
"MinSegments": 0,
|
"MinSegments": 0,
|
||||||
"SegmentLength": 0,
|
"SegmentLength": 0,
|
||||||
"BreakOnNonKeyFrames": false,
|
|
||||||
"$type": "TranscodingProfile"
|
"$type": "TranscodingProfile"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -250,7 +245,6 @@
|
||||||
"MaxAudioChannels": "6",
|
"MaxAudioChannels": "6",
|
||||||
"MinSegments": 0,
|
"MinSegments": 0,
|
||||||
"SegmentLength": 0,
|
"SegmentLength": 0,
|
||||||
"BreakOnNonKeyFrames": false,
|
|
||||||
"$type": "TranscodingProfile"
|
"$type": "TranscodingProfile"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -267,7 +261,6 @@
|
||||||
"MaxAudioChannels": "6",
|
"MaxAudioChannels": "6",
|
||||||
"MinSegments": 0,
|
"MinSegments": 0,
|
||||||
"SegmentLength": 0,
|
"SegmentLength": 0,
|
||||||
"BreakOnNonKeyFrames": false,
|
|
||||||
"$type": "TranscodingProfile"
|
"$type": "TranscodingProfile"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -284,7 +277,6 @@
|
||||||
"MaxAudioChannels": "6",
|
"MaxAudioChannels": "6",
|
||||||
"MinSegments": 0,
|
"MinSegments": 0,
|
||||||
"SegmentLength": 0,
|
"SegmentLength": 0,
|
||||||
"BreakOnNonKeyFrames": false,
|
|
||||||
"$type": "TranscodingProfile"
|
"$type": "TranscodingProfile"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -301,7 +293,6 @@
|
||||||
"MaxAudioChannels": "6",
|
"MaxAudioChannels": "6",
|
||||||
"MinSegments": 0,
|
"MinSegments": 0,
|
||||||
"SegmentLength": 0,
|
"SegmentLength": 0,
|
||||||
"BreakOnNonKeyFrames": false,
|
|
||||||
"$type": "TranscodingProfile"
|
"$type": "TranscodingProfile"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -319,7 +310,6 @@
|
||||||
"MaxAudioChannels": "6",
|
"MaxAudioChannels": "6",
|
||||||
"MinSegments": 0,
|
"MinSegments": 0,
|
||||||
"SegmentLength": 0,
|
"SegmentLength": 0,
|
||||||
"BreakOnNonKeyFrames": false,
|
|
||||||
"Conditions": [
|
"Conditions": [
|
||||||
{
|
{
|
||||||
"Condition": "LessThanEqual",
|
"Condition": "LessThanEqual",
|
||||||
|
|
@ -346,7 +336,6 @@
|
||||||
"MaxAudioChannels": "6",
|
"MaxAudioChannels": "6",
|
||||||
"MinSegments": 1,
|
"MinSegments": 1,
|
||||||
"SegmentLength": 0,
|
"SegmentLength": 0,
|
||||||
"BreakOnNonKeyFrames": false,
|
|
||||||
"Conditions": [
|
"Conditions": [
|
||||||
{
|
{
|
||||||
"Condition": "LessThanEqual",
|
"Condition": "LessThanEqual",
|
||||||
|
|
@ -373,7 +362,6 @@
|
||||||
"MaxAudioChannels": "6",
|
"MaxAudioChannels": "6",
|
||||||
"MinSegments": 0,
|
"MinSegments": 0,
|
||||||
"SegmentLength": 0,
|
"SegmentLength": 0,
|
||||||
"BreakOnNonKeyFrames": false,
|
|
||||||
"Conditions": [
|
"Conditions": [
|
||||||
{
|
{
|
||||||
"Condition": "LessThanEqual",
|
"Condition": "LessThanEqual",
|
||||||
|
|
@ -399,7 +387,6 @@
|
||||||
"EnableSubtitlesInManifest": false,
|
"EnableSubtitlesInManifest": false,
|
||||||
"MinSegments": 0,
|
"MinSegments": 0,
|
||||||
"SegmentLength": 0,
|
"SegmentLength": 0,
|
||||||
"BreakOnNonKeyFrames": false,
|
|
||||||
"Conditions": [
|
"Conditions": [
|
||||||
{
|
{
|
||||||
"Condition": "LessThanEqual",
|
"Condition": "LessThanEqual",
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,6 @@
|
||||||
"EnableSubtitlesInManifest": false,
|
"EnableSubtitlesInManifest": false,
|
||||||
"MinSegments": 0,
|
"MinSegments": 0,
|
||||||
"SegmentLength": 0,
|
"SegmentLength": 0,
|
||||||
"BreakOnNonKeyFrames": false,
|
|
||||||
"$type": "TranscodingProfile"
|
"$type": "TranscodingProfile"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -28,7 +27,6 @@
|
||||||
"Protocol": "hls",
|
"Protocol": "hls",
|
||||||
"MaxAudioChannels": "2",
|
"MaxAudioChannels": "2",
|
||||||
"MinSegments": "2",
|
"MinSegments": "2",
|
||||||
"BreakOnNonKeyFrames": true,
|
|
||||||
"$type": "TranscodingProfile"
|
"$type": "TranscodingProfile"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -40,7 +38,6 @@
|
||||||
"Protocol": "hls",
|
"Protocol": "hls",
|
||||||
"MaxAudioChannels": "2",
|
"MaxAudioChannels": "2",
|
||||||
"MinSegments": "2",
|
"MinSegments": "2",
|
||||||
"BreakOnNonKeyFrames": true,
|
|
||||||
"$type": "TranscodingProfile"
|
"$type": "TranscodingProfile"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -64,7 +61,6 @@
|
||||||
"EnableSubtitlesInManifest": false,
|
"EnableSubtitlesInManifest": false,
|
||||||
"MinSegments": 0,
|
"MinSegments": 0,
|
||||||
"SegmentLength": 0,
|
"SegmentLength": 0,
|
||||||
"BreakOnNonKeyFrames": false,
|
|
||||||
"$type": "TranscodingProfile"
|
"$type": "TranscodingProfile"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|
|
||||||
|
|
@ -135,7 +135,6 @@
|
||||||
"Protocol": "hls",
|
"Protocol": "hls",
|
||||||
"MaxAudioChannels": "6",
|
"MaxAudioChannels": "6",
|
||||||
"MinSegments": "1",
|
"MinSegments": "1",
|
||||||
"BreakOnNonKeyFrames": false,
|
|
||||||
"EnableAudioVbrEncoding": true
|
"EnableAudioVbrEncoding": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -210,8 +209,7 @@
|
||||||
"Context": "Streaming",
|
"Context": "Streaming",
|
||||||
"Protocol": "hls",
|
"Protocol": "hls",
|
||||||
"MaxAudioChannels": "6",
|
"MaxAudioChannels": "6",
|
||||||
"MinSegments": "1",
|
"MinSegments": "1"
|
||||||
"BreakOnNonKeyFrames": false
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"ContainerProfiles": [],
|
"ContainerProfiles": [],
|
||||||
|
|
|
||||||
|
|
@ -52,7 +52,6 @@
|
||||||
"MaxAudioChannels": "6",
|
"MaxAudioChannels": "6",
|
||||||
"MinSegments": 0,
|
"MinSegments": 0,
|
||||||
"SegmentLength": 0,
|
"SegmentLength": 0,
|
||||||
"BreakOnNonKeyFrames": false,
|
|
||||||
"$type": "TranscodingProfile"
|
"$type": "TranscodingProfile"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -70,7 +69,6 @@
|
||||||
"MaxAudioChannels": "6",
|
"MaxAudioChannels": "6",
|
||||||
"MinSegments": 0,
|
"MinSegments": 0,
|
||||||
"SegmentLength": 0,
|
"SegmentLength": 0,
|
||||||
"BreakOnNonKeyFrames": false,
|
|
||||||
"$type": "TranscodingProfile"
|
"$type": "TranscodingProfile"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -88,7 +86,6 @@
|
||||||
"MaxAudioChannels": "6",
|
"MaxAudioChannels": "6",
|
||||||
"MinSegments": 0,
|
"MinSegments": 0,
|
||||||
"SegmentLength": 0,
|
"SegmentLength": 0,
|
||||||
"BreakOnNonKeyFrames": false,
|
|
||||||
"$type": "TranscodingProfile"
|
"$type": "TranscodingProfile"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|
|
||||||
|
|
@ -52,7 +52,6 @@
|
||||||
"MaxAudioChannels": "6",
|
"MaxAudioChannels": "6",
|
||||||
"MinSegments": 0,
|
"MinSegments": 0,
|
||||||
"SegmentLength": 0,
|
"SegmentLength": 0,
|
||||||
"BreakOnNonKeyFrames": false,
|
|
||||||
"$type": "TranscodingProfile"
|
"$type": "TranscodingProfile"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -70,7 +69,6 @@
|
||||||
"MaxAudioChannels": "6",
|
"MaxAudioChannels": "6",
|
||||||
"MinSegments": 0,
|
"MinSegments": 0,
|
||||||
"SegmentLength": 0,
|
"SegmentLength": 0,
|
||||||
"BreakOnNonKeyFrames": false,
|
|
||||||
"$type": "TranscodingProfile"
|
"$type": "TranscodingProfile"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -88,7 +86,6 @@
|
||||||
"MaxAudioChannels": "6",
|
"MaxAudioChannels": "6",
|
||||||
"MinSegments": 0,
|
"MinSegments": 0,
|
||||||
"SegmentLength": 0,
|
"SegmentLength": 0,
|
||||||
"BreakOnNonKeyFrames": false,
|
|
||||||
"$type": "TranscodingProfile"
|
"$type": "TranscodingProfile"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue