mirror of https://github.com/jellyfin/jellyfin.git
Fix transcode video matching and add tests for Transcode and Safari
This commit is contained in:
parent
5e779f20ee
commit
84a3db6f84
|
@ -749,13 +749,20 @@ namespace MediaBrowser.Model.Dlna
|
||||||
transcodingProfiles = transcodingProfiles.ToLookup(transcodingProfile =>
|
transcodingProfiles = transcodingProfiles.ToLookup(transcodingProfile =>
|
||||||
{
|
{
|
||||||
var videoCodecs = ContainerProfile.SplitValue(transcodingProfile.VideoCodec);
|
var videoCodecs = ContainerProfile.SplitValue(transcodingProfile.VideoCodec);
|
||||||
var match = ContainerProfile.ContainsContainer(videoCodecs, item.VideoStream.Codec) &&
|
|
||||||
options.Profile.CodecProfiles
|
|
||||||
.Any(i => i.Type == CodecType.Video &&
|
|
||||||
i.ContainsAnyCodec(transcodingProfile.VideoCodec, transcodingProfile.Container) &&
|
|
||||||
i.ApplyConditions.Any(applyCondition => !ConditionProcessor.IsVideoConditionSatisfied(applyCondition, videoStream?.Width, videoStream?.Height, videoStream?.BitDepth, videoStream?.BitRate, videoStream?.Profile, videoStream?.Level, videoFramerate, videoStream?.PacketLength, timestamp, videoStream?.IsAnamorphic, videoStream?.IsInterlaced, videoStream?.RefFrames, numVideoStreams, numAudioStreams, videoStream?.CodecTag, videoStream?.IsAVC)));
|
|
||||||
|
|
||||||
return match ? 1 : 2;
|
if (ContainerProfile.ContainsContainer(videoCodecs, item.VideoStream.Codec)) {
|
||||||
|
var videoCodec = transcodingProfile.VideoCodec;
|
||||||
|
var container = transcodingProfile.Container;
|
||||||
|
var appliedVideoConditions = options.Profile.CodecProfiles
|
||||||
|
.Where(i => i.Type == CodecType.Video &&
|
||||||
|
i.ContainsAnyCodec(videoCodec, container))
|
||||||
|
.Select(i =>
|
||||||
|
i.ApplyConditions.Any(applyCondition => ConditionProcessor.IsVideoConditionSatisfied(applyCondition, videoStream?.Width, videoStream?.Height, videoStream?.BitDepth, videoStream?.BitRate, videoStream?.Profile, videoStream?.Level, videoFramerate, videoStream?.PacketLength, timestamp, videoStream?.IsAnamorphic, videoStream?.IsInterlaced, videoStream?.RefFrames, numVideoStreams, numAudioStreams, videoStream?.CodecTag, videoStream?.IsAVC)));
|
||||||
|
var conditionsSatisfied = !appliedVideoConditions.Any() || !appliedVideoConditions.Any(satisfied => !satisfied);
|
||||||
|
return conditionsSatisfied ? 1 : 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 3;
|
||||||
})
|
})
|
||||||
.OrderBy(lookup => lookup.Key)
|
.OrderBy(lookup => lookup.Key)
|
||||||
.SelectMany(lookup => lookup);
|
.SelectMany(lookup => lookup);
|
||||||
|
|
|
@ -47,9 +47,9 @@ namespace Jellyfin.MediaBrowser.Model.Tests
|
||||||
[InlineData("SafariNext", "mp4-h264-ac3-aacDef-srt-2600k", PlayMethod.DirectPlay)] // #6450
|
[InlineData("SafariNext", "mp4-h264-ac3-aacDef-srt-2600k", PlayMethod.DirectPlay)] // #6450
|
||||||
[InlineData("SafariNext", "mp4-h264-ac3-aacExt-srt-2600k", PlayMethod.DirectPlay)] // #6450
|
[InlineData("SafariNext", "mp4-h264-ac3-aacExt-srt-2600k", PlayMethod.DirectPlay)] // #6450
|
||||||
[InlineData("SafariNext", "mp4-h264-ac3-srt-2600k", PlayMethod.DirectPlay)] // #6450
|
[InlineData("SafariNext", "mp4-h264-ac3-srt-2600k", PlayMethod.DirectPlay)] // #6450
|
||||||
[InlineData("SafariNext", "mp4-hevc-aac-srt-15200k", PlayMethod.DirectPlay)] // #6450
|
[InlineData("SafariNext", "mp4-hevc-aac-srt-15200k", PlayMethod.Transcode, TranscodeReason.VideoCodecNotSupported, "Remux", "HLS.mp4")] // #6450
|
||||||
[InlineData("SafariNext", "mp4-hevc-ac3-aac-srt-15200k", PlayMethod.DirectPlay)] // #6450
|
[InlineData("SafariNext", "mp4-hevc-ac3-aac-srt-15200k", PlayMethod.Transcode, TranscodeReason.VideoCodecNotSupported, "Remux", "HLS.mp4")] // #6450
|
||||||
[InlineData("SafariNext", "mp4-hevc-ac3-aacExt-srt-15200k", PlayMethod.DirectPlay)] // #6450
|
[InlineData("SafariNext", "mp4-hevc-ac3-aacExt-srt-15200k", PlayMethod.Transcode, TranscodeReason.VideoCodecNotSupported, "Remux", "HLS.mp4")] // #6450
|
||||||
// AndroidPixel
|
// AndroidPixel
|
||||||
[InlineData("AndroidPixel", "mp4-h264-aac-srt-2600k", PlayMethod.DirectPlay)] // #6450
|
[InlineData("AndroidPixel", "mp4-h264-aac-srt-2600k", PlayMethod.DirectPlay)] // #6450
|
||||||
[InlineData("AndroidPixel", "mp4-h264-ac3-aac-srt-2600k", PlayMethod.DirectPlay)] // #6450
|
[InlineData("AndroidPixel", "mp4-h264-ac3-aac-srt-2600k", PlayMethod.DirectPlay)] // #6450
|
||||||
|
@ -93,14 +93,16 @@ namespace Jellyfin.MediaBrowser.Model.Tests
|
||||||
[InlineData("Chrome-NoHLS", "mkv-vp9-ac3-srt-2600k", PlayMethod.DirectStream, TranscodeReason.AudioCodecNotSupported)] // #6450
|
[InlineData("Chrome-NoHLS", "mkv-vp9-ac3-srt-2600k", PlayMethod.DirectStream, TranscodeReason.AudioCodecNotSupported)] // #6450
|
||||||
[InlineData("Chrome-NoHLS", "mkv-vp9-vorbis-vtt-2600k", PlayMethod.DirectPlay, TranscodeReason.None, "Remux")] // #6450
|
[InlineData("Chrome-NoHLS", "mkv-vp9-vorbis-vtt-2600k", PlayMethod.DirectPlay, TranscodeReason.None, "Remux")] // #6450
|
||||||
// TranscodeMedia
|
// TranscodeMedia
|
||||||
[InlineData("TranscodeMedia", "mp4-h264-aac-vtt-2600k", PlayMethod.Transcode, TranscodeReason.DirectPlayError, "Transcode")]
|
[InlineData("TranscodeMedia", "mp4-h264-aac-vtt-2600k", PlayMethod.Transcode, TranscodeReason.DirectPlayError, "Remux", "HLS.mp4")]
|
||||||
[InlineData("TranscodeMedia", "mp4-h264-ac3-aac-srt-2600k", PlayMethod.Transcode, TranscodeReason.DirectPlayError, "Transcode")]
|
[InlineData("TranscodeMedia", "mp4-h264-ac3-aac-srt-2600k", PlayMethod.Transcode, TranscodeReason.DirectPlayError, "Remux", "HLS.mp4")]
|
||||||
[InlineData("TranscodeMedia", "mp4-h264-ac3-srt-2600k", PlayMethod.Transcode, TranscodeReason.DirectPlayError, "Transcode")]
|
[InlineData("TranscodeMedia", "mp4-h264-ac3-srt-2600k", PlayMethod.Transcode, TranscodeReason.DirectPlayError, "DirectStream", "HLS.mp4")]
|
||||||
[InlineData("TranscodeMedia", "mp4-hevc-aac-srt-15200k", PlayMethod.Transcode, TranscodeReason.DirectPlayError, "Transcode")]
|
[InlineData("TranscodeMedia", "mp4-hevc-aac-srt-15200k", PlayMethod.Transcode, TranscodeReason.DirectPlayError, "Remux", "HLS.mp4")]
|
||||||
[InlineData("TranscodeMedia", "mp4-hevc-ac3-aac-srt-15200k", PlayMethod.Transcode, TranscodeReason.DirectPlayError, "Transcode")]
|
[InlineData("TranscodeMedia", "mp4-hevc-ac3-aac-srt-15200k", PlayMethod.Transcode, TranscodeReason.DirectPlayError, "Remux", "HLS.mp4")]
|
||||||
[InlineData("TranscodeMedia", "mkv-vp9-aac-srt-2600k", PlayMethod.Transcode, TranscodeReason.DirectPlayError, "Transcode")]
|
[InlineData("TranscodeMedia", "mkv-av1-aac-srt-2600k", PlayMethod.Transcode, TranscodeReason.DirectPlayError, "DirectStream", "http")]
|
||||||
[InlineData("TranscodeMedia", "mkv-vp9-ac3-srt-2600k", PlayMethod.Transcode, TranscodeReason.DirectPlayError, "Transcode")]
|
[InlineData("TranscodeMedia", "mkv-av1-vorbis-srt-2600k", PlayMethod.Transcode, TranscodeReason.DirectPlayError, "Remux", "http")]
|
||||||
[InlineData("TranscodeMedia", "mkv-vp9-vorbis-vtt-2600k", PlayMethod.Transcode, TranscodeReason.DirectPlayError, "Transcode")]
|
[InlineData("TranscodeMedia", "mkv-vp9-aac-srt-2600k", PlayMethod.Transcode, TranscodeReason.DirectPlayError, "DirectStream", "http")]
|
||||||
|
[InlineData("TranscodeMedia", "mkv-vp9-ac3-srt-2600k", PlayMethod.Transcode, TranscodeReason.DirectPlayError, "DirectStream", "http")]
|
||||||
|
[InlineData("TranscodeMedia", "mkv-vp9-vorbis-vtt-2600k", PlayMethod.Transcode, TranscodeReason.DirectPlayError, "Remux", "http")]
|
||||||
// DirectMedia
|
// DirectMedia
|
||||||
[InlineData("DirectMedia", "mp4-h264-aac-vtt-2600k", PlayMethod.DirectPlay, TranscodeReason.None, "Remux")]
|
[InlineData("DirectMedia", "mp4-h264-aac-vtt-2600k", PlayMethod.DirectPlay, TranscodeReason.None, "Remux")]
|
||||||
[InlineData("DirectMedia", "mp4-h264-ac3-aac-srt-2600k", PlayMethod.DirectPlay, TranscodeReason.None, "Remux")]
|
[InlineData("DirectMedia", "mp4-h264-ac3-aac-srt-2600k", PlayMethod.DirectPlay, TranscodeReason.None, "Remux")]
|
||||||
|
@ -129,8 +131,6 @@ namespace Jellyfin.MediaBrowser.Model.Tests
|
||||||
[InlineData("Null", "mkv-vp9-aac-srt-2600k", null, TranscodeReason.ContainerBitrateExceedsLimit)]
|
[InlineData("Null", "mkv-vp9-aac-srt-2600k", null, TranscodeReason.ContainerBitrateExceedsLimit)]
|
||||||
[InlineData("Null", "mkv-vp9-ac3-srt-2600k", null, TranscodeReason.ContainerBitrateExceedsLimit)]
|
[InlineData("Null", "mkv-vp9-ac3-srt-2600k", null, TranscodeReason.ContainerBitrateExceedsLimit)]
|
||||||
[InlineData("Null", "mkv-vp9-vorbis-vtt-2600k", null, TranscodeReason.ContainerBitrateExceedsLimit)]
|
[InlineData("Null", "mkv-vp9-vorbis-vtt-2600k", null, TranscodeReason.ContainerBitrateExceedsLimit)]
|
||||||
|
|
||||||
// [InlineData("Chrome", "mp4-hevc-ac3-aac-srt-15200k", PlayMethod.Transcode, TranscodeReason.VideoCodecNotSupported | TranscodeReason.AudioCodecNotSupported, "Transcode")]
|
|
||||||
public async Task BuildVideoItemSimple(string deviceName, string mediaSource, PlayMethod? playMethod, TranscodeReason why = TranscodeReason.None, string transcodeMode = "DirectStream", string transcodeProtocol = "")
|
public async Task BuildVideoItemSimple(string deviceName, string mediaSource, PlayMethod? playMethod, TranscodeReason why = TranscodeReason.None, string transcodeMode = "DirectStream", string transcodeProtocol = "")
|
||||||
{
|
{
|
||||||
var options = await GetVideoOptions(deviceName, mediaSource);
|
var options = await GetVideoOptions(deviceName, mediaSource);
|
||||||
|
@ -165,9 +165,9 @@ namespace Jellyfin.MediaBrowser.Model.Tests
|
||||||
[InlineData("SafariNext", "mp4-h264-ac3-aacDef-srt-2600k", PlayMethod.DirectPlay)] // #6450
|
[InlineData("SafariNext", "mp4-h264-ac3-aacDef-srt-2600k", PlayMethod.DirectPlay)] // #6450
|
||||||
[InlineData("SafariNext", "mp4-h264-ac3-aacExt-srt-2600k", PlayMethod.DirectPlay)] // #6450
|
[InlineData("SafariNext", "mp4-h264-ac3-aacExt-srt-2600k", PlayMethod.DirectPlay)] // #6450
|
||||||
[InlineData("SafariNext", "mp4-h264-ac3-srt-2600k", PlayMethod.DirectPlay)] // #6450
|
[InlineData("SafariNext", "mp4-h264-ac3-srt-2600k", PlayMethod.DirectPlay)] // #6450
|
||||||
[InlineData("SafariNext", "mp4-hevc-aac-srt-15200k", PlayMethod.DirectPlay)] // #6450
|
[InlineData("SafariNext", "mp4-hevc-aac-srt-15200k", PlayMethod.Transcode, TranscodeReason.VideoCodecNotSupported, "Remux", "HLS.mp4")] // #6450
|
||||||
[InlineData("SafariNext", "mp4-hevc-ac3-aac-srt-15200k", PlayMethod.DirectPlay)] // #6450
|
[InlineData("SafariNext", "mp4-hevc-ac3-aac-srt-15200k", PlayMethod.Transcode, TranscodeReason.VideoCodecNotSupported, "Remux", "HLS.mp4")] // #6450
|
||||||
[InlineData("SafariNext", "mp4-hevc-ac3-aacExt-srt-15200k", PlayMethod.DirectPlay)] // #6450
|
[InlineData("SafariNext", "mp4-hevc-ac3-aacExt-srt-15200k", PlayMethod.Transcode, TranscodeReason.VideoCodecNotSupported, "Remux", "HLS.mp4")] // #6450
|
||||||
// AndroidPixel
|
// AndroidPixel
|
||||||
[InlineData("AndroidPixel", "mp4-h264-aac-srt-2600k", PlayMethod.DirectPlay)] // #6450
|
[InlineData("AndroidPixel", "mp4-h264-aac-srt-2600k", PlayMethod.DirectPlay)] // #6450
|
||||||
[InlineData("AndroidPixel", "mp4-h264-ac3-aacDef-srt-2600k", PlayMethod.DirectPlay)] // #6450
|
[InlineData("AndroidPixel", "mp4-h264-ac3-aacDef-srt-2600k", PlayMethod.DirectPlay)] // #6450
|
||||||
|
@ -239,7 +239,7 @@ namespace Jellyfin.MediaBrowser.Model.Tests
|
||||||
{
|
{
|
||||||
if (string.IsNullOrEmpty(transcodeProtocol))
|
if (string.IsNullOrEmpty(transcodeProtocol))
|
||||||
{
|
{
|
||||||
transcodeProtocol = playMethod == PlayMethod.DirectStream ? "http" : "hls";
|
transcodeProtocol = playMethod == PlayMethod.DirectStream ? "http" : "HLS.ts";
|
||||||
}
|
}
|
||||||
|
|
||||||
var builder = GetStreamBuilder();
|
var builder = GetStreamBuilder();
|
||||||
|
@ -302,6 +302,13 @@ namespace Jellyfin.MediaBrowser.Model.Tests
|
||||||
Assert.Equal("stream", uri.Filename);
|
Assert.Equal("stream", uri.Filename);
|
||||||
Assert.Equal("http", val.SubProtocol);
|
Assert.Equal("http", val.SubProtocol);
|
||||||
}
|
}
|
||||||
|
else if (transcodeProtocol == "HLS.mp4")
|
||||||
|
{
|
||||||
|
Assert.Equal("mp4", val.Container);
|
||||||
|
Assert.Equal("m3u8", uri.Extension);
|
||||||
|
Assert.Equal("master", uri.Filename);
|
||||||
|
Assert.Equal("hls", val.SubProtocol);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Assert.Equal("ts", val.Container);
|
Assert.Equal("ts", val.Container);
|
||||||
|
|
|
@ -24,14 +24,14 @@
|
||||||
{
|
{
|
||||||
"Container": "mp4,m4v",
|
"Container": "mp4,m4v",
|
||||||
"AudioCodec": "aac,mp3,ac3,eac3,flac,alac,vorbis",
|
"AudioCodec": "aac,mp3,ac3,eac3,flac,alac,vorbis",
|
||||||
"VideoCodec": "hevc,h264,vp8,vp9",
|
"VideoCodec": "h264,vp8,vp9",
|
||||||
"Type": "Video",
|
"Type": "Video",
|
||||||
"$type": "DirectPlayProfile"
|
"$type": "DirectPlayProfile"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Container": "mov",
|
"Container": "mov",
|
||||||
"AudioCodec": "aac,mp3,ac3,eac3,flac,alac,vorbis",
|
"AudioCodec": "aac,mp3,ac3,eac3,flac,alac,vorbis",
|
||||||
"VideoCodec": "hevc,h264",
|
"VideoCodec": "h264",
|
||||||
"Type": "Video",
|
"Type": "Video",
|
||||||
"$type": "DirectPlayProfile"
|
"$type": "DirectPlayProfile"
|
||||||
},
|
},
|
||||||
|
@ -216,58 +216,44 @@
|
||||||
"BreakOnNonKeyFrames": false,
|
"BreakOnNonKeyFrames": false,
|
||||||
"$type": "TranscodingProfile"
|
"$type": "TranscodingProfile"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"Container": "mp4",
|
||||||
|
"Type": "Video",
|
||||||
|
"AudioCodec": "aac,ac3,eac3,flac,alac",
|
||||||
|
"VideoCodec": "hevc,h264",
|
||||||
|
"Context": "Streaming",
|
||||||
|
"Protocol": "hls",
|
||||||
|
"MaxAudioChannels": "2",
|
||||||
|
"MinSegments": "2",
|
||||||
|
"BreakOnNonKeyFrames": true
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"Container": "ts",
|
"Container": "ts",
|
||||||
"Type": "Video",
|
"Type": "Video",
|
||||||
"VideoCodec": "hevc,h264",
|
|
||||||
"AudioCodec": "aac,mp3,ac3,eac3",
|
"AudioCodec": "aac,mp3,ac3,eac3",
|
||||||
"Protocol": "hls",
|
"VideoCodec": "h264",
|
||||||
"EstimateContentLength": false,
|
|
||||||
"EnableMpegtsM2TsMode": false,
|
|
||||||
"TranscodeSeekInfo": "Auto",
|
|
||||||
"CopyTimestamps": false,
|
|
||||||
"Context": "Streaming",
|
"Context": "Streaming",
|
||||||
"EnableSubtitlesInManifest": false,
|
"Protocol": "hls",
|
||||||
"MaxAudioChannels": "6",
|
"MaxAudioChannels": "2",
|
||||||
"MinSegments": 2,
|
"MinSegments": "2",
|
||||||
"SegmentLength": 0,
|
"BreakOnNonKeyFrames": true
|
||||||
"BreakOnNonKeyFrames": true,
|
|
||||||
"$type": "TranscodingProfile"
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Container": "webm",
|
"Container": "webm",
|
||||||
"Type": "Video",
|
"Type": "Video",
|
||||||
"VideoCodec": "vp8,vp9,vpx",
|
|
||||||
"AudioCodec": "vorbis",
|
"AudioCodec": "vorbis",
|
||||||
"Protocol": "http",
|
"VideoCodec": "vp8,vpx",
|
||||||
"EstimateContentLength": false,
|
|
||||||
"EnableMpegtsM2TsMode": false,
|
|
||||||
"TranscodeSeekInfo": "Auto",
|
|
||||||
"CopyTimestamps": false,
|
|
||||||
"Context": "Streaming",
|
"Context": "Streaming",
|
||||||
"EnableSubtitlesInManifest": false,
|
"Protocol": "http",
|
||||||
"MaxAudioChannels": "6",
|
"MaxAudioChannels": "2"
|
||||||
"MinSegments": 0,
|
|
||||||
"SegmentLength": 0,
|
|
||||||
"BreakOnNonKeyFrames": false,
|
|
||||||
"$type": "TranscodingProfile"
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Container": "mp4",
|
"Container": "mp4",
|
||||||
"Type": "Video",
|
"Type": "Video",
|
||||||
"VideoCodec": "hevc,h264",
|
|
||||||
"AudioCodec": "aac,mp3,ac3,eac3,flac,alac,vorbis",
|
"AudioCodec": "aac,mp3,ac3,eac3,flac,alac,vorbis",
|
||||||
"Protocol": "http",
|
"VideoCodec": "h264",
|
||||||
"EstimateContentLength": false,
|
|
||||||
"EnableMpegtsM2TsMode": false,
|
|
||||||
"TranscodeSeekInfo": "Auto",
|
|
||||||
"CopyTimestamps": false,
|
|
||||||
"Context": "Static",
|
"Context": "Static",
|
||||||
"EnableSubtitlesInManifest": false,
|
"Protocol": "http"
|
||||||
"MinSegments": 0,
|
|
||||||
"SegmentLength": 0,
|
|
||||||
"BreakOnNonKeyFrames": false,
|
|
||||||
"$type": "TranscodingProfile"
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"CodecProfiles": [
|
"CodecProfiles": [
|
||||||
|
|
|
@ -19,22 +19,38 @@
|
||||||
"BreakOnNonKeyFrames": false,
|
"BreakOnNonKeyFrames": false,
|
||||||
"$type": "TranscodingProfile"
|
"$type": "TranscodingProfile"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"Container": "mp4",
|
||||||
|
"Type": "Video",
|
||||||
|
"AudioCodec": "aac,flac,alac",
|
||||||
|
"VideoCodec": "hevc,h264",
|
||||||
|
"Context": "Streaming",
|
||||||
|
"Protocol": "hls",
|
||||||
|
"MaxAudioChannels": "2",
|
||||||
|
"MinSegments": "2",
|
||||||
|
"BreakOnNonKeyFrames": true,
|
||||||
|
"$type": "TranscodingProfile"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"Container": "ts",
|
"Container": "ts",
|
||||||
"Type": "Video",
|
"Type": "Video",
|
||||||
"VideoCodec": "h264,h265,hevc,mpeg4,mpeg2video",
|
"AudioCodec": "aac,mp3",
|
||||||
"AudioCodec": "aac,mp3,ac3,opus,flac,vorbis",
|
"VideoCodec": "h264",
|
||||||
"Protocol": "hls",
|
|
||||||
"EstimateContentLength": false,
|
|
||||||
"EnableMpegtsM2TsMode": false,
|
|
||||||
"TranscodeSeekInfo": "Auto",
|
|
||||||
"CopyTimestamps": false,
|
|
||||||
"Context": "Streaming",
|
"Context": "Streaming",
|
||||||
"EnableSubtitlesInManifest": false,
|
"Protocol": "hls",
|
||||||
"MaxAudioChannels": "6",
|
"MaxAudioChannels": "2",
|
||||||
"MinSegments": 0,
|
"MinSegments": "2",
|
||||||
"SegmentLength": 0,
|
"BreakOnNonKeyFrames": true,
|
||||||
"BreakOnNonKeyFrames": false,
|
"$type": "TranscodingProfile"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Container": "webm",
|
||||||
|
"Type": "Video",
|
||||||
|
"AudioCodec": "vorbis",
|
||||||
|
"VideoCodec": "vp9,vp8,vpx,av1",
|
||||||
|
"Context": "Streaming",
|
||||||
|
"Protocol": "http",
|
||||||
|
"MaxAudioChannels": "2",
|
||||||
"$type": "TranscodingProfile"
|
"$type": "TranscodingProfile"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
|
@ -0,0 +1,73 @@
|
||||||
|
{
|
||||||
|
"Id": "a766d122b58e45d9492d17af66748bf5",
|
||||||
|
"Path": "/Media/MyVideo-720p.mkv",
|
||||||
|
"Container": "mkv,webm",
|
||||||
|
"Size": 835317696,
|
||||||
|
"Name": "MyVideo-1080p",
|
||||||
|
"ETag": "579a34c6d5dfb23f61539a51220b6a23",
|
||||||
|
"RunTimeTicks": 25801230336,
|
||||||
|
"SupportsTranscoding": true,
|
||||||
|
"SupportsDirectStream": true,
|
||||||
|
"SupportsDirectPlay": true,
|
||||||
|
"SupportsProbing": true,
|
||||||
|
"MediaStreams": [
|
||||||
|
{
|
||||||
|
"Codec": "av1",
|
||||||
|
"Language": "eng",
|
||||||
|
"ColorTransfer": "bt709",
|
||||||
|
"ColorPrimaries": "bt709",
|
||||||
|
"TimeBase": "1/11988",
|
||||||
|
"VideoRange": "SDR",
|
||||||
|
"DisplayTitle": "1080p AV1 SDR",
|
||||||
|
"NalLengthSize": "0",
|
||||||
|
"BitRate": 2032876,
|
||||||
|
"BitDepth": 8,
|
||||||
|
"RefFrames": 1,
|
||||||
|
"IsDefault": true,
|
||||||
|
"Height": 720,
|
||||||
|
"Width": 1280,
|
||||||
|
"AverageFrameRate": 23.976,
|
||||||
|
"RealFrameRate": 23.976,
|
||||||
|
"Profile": "Main",
|
||||||
|
"Type": 1,
|
||||||
|
"AspectRatio": "16:9",
|
||||||
|
"PixelFormat": "yuv420p",
|
||||||
|
"Level": -99
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Codec": "aac",
|
||||||
|
"CodecTag": "mp4a",
|
||||||
|
"Language": "eng",
|
||||||
|
"TimeBase": "1/48000",
|
||||||
|
"DisplayTitle": "En - AAC - Stereo - Default",
|
||||||
|
"ChannelLayout": "stereo",
|
||||||
|
"BitRate": 164741,
|
||||||
|
"Channels": 2,
|
||||||
|
"SampleRate": 48000,
|
||||||
|
"IsDefault": true,
|
||||||
|
"Profile": "LC",
|
||||||
|
"Index": 1,
|
||||||
|
"Score": 203
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Codec": "srt",
|
||||||
|
"Language": "eng",
|
||||||
|
"TimeBase": "1/1000000",
|
||||||
|
"localizedUndefined": "Undefined",
|
||||||
|
"localizedDefault": "Default",
|
||||||
|
"localizedForced": "Forced",
|
||||||
|
"DisplayTitle": "En - Default",
|
||||||
|
"BitRate": 92,
|
||||||
|
"IsDefault": true,
|
||||||
|
"Type": 2,
|
||||||
|
"Index": 2,
|
||||||
|
"Score": 6421,
|
||||||
|
"IsExternal": true,
|
||||||
|
"IsTextSubtitleStream": true,
|
||||||
|
"SupportsExternalStream": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"Bitrate": 2590008,
|
||||||
|
"DefaultAudioStreamIndex": 1,
|
||||||
|
"DefaultSubtitleStreamIndex": 2
|
||||||
|
}
|
|
@ -0,0 +1,72 @@
|
||||||
|
{
|
||||||
|
"Id": "a766d122b58e45d9492d17af66748bf5",
|
||||||
|
"Path": "/Media/MyVideo-720p.mkv",
|
||||||
|
"Container": "mkv,webm",
|
||||||
|
"Size": 835317696,
|
||||||
|
"Name": "MyVideo-1080p",
|
||||||
|
"ETag": "579a34c6d5dfb23f61539a51220b6a23",
|
||||||
|
"RunTimeTicks": 25801230336,
|
||||||
|
"SupportsTranscoding": true,
|
||||||
|
"SupportsDirectStream": true,
|
||||||
|
"SupportsDirectPlay": true,
|
||||||
|
"SupportsProbing": true,
|
||||||
|
"MediaStreams": [
|
||||||
|
{
|
||||||
|
"Codec": "av1",
|
||||||
|
"Language": "eng",
|
||||||
|
"ColorTransfer": "bt709",
|
||||||
|
"ColorPrimaries": "bt709",
|
||||||
|
"TimeBase": "1/11988",
|
||||||
|
"VideoRange": "SDR",
|
||||||
|
"DisplayTitle": "1080p AV1 SDR",
|
||||||
|
"NalLengthSize": "0",
|
||||||
|
"BitRate": 2032876,
|
||||||
|
"BitDepth": 8,
|
||||||
|
"RefFrames": 1,
|
||||||
|
"IsDefault": true,
|
||||||
|
"Height": 720,
|
||||||
|
"Width": 1280,
|
||||||
|
"AverageFrameRate": 23.976,
|
||||||
|
"RealFrameRate": 23.976,
|
||||||
|
"Profile": "Main",
|
||||||
|
"Type": 1,
|
||||||
|
"AspectRatio": "16:9",
|
||||||
|
"PixelFormat": "yuv420p",
|
||||||
|
"Level": -99
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Codec": "vorbis",
|
||||||
|
"CodecTag": "ogg",
|
||||||
|
"Language": "eng",
|
||||||
|
"TimeBase": "1/48000",
|
||||||
|
"DisplayTitle": "En - Vorbis - Stereo - Default",
|
||||||
|
"ChannelLayout": "stereo",
|
||||||
|
"BitRate": 164741,
|
||||||
|
"Channels": 2,
|
||||||
|
"SampleRate": 48000,
|
||||||
|
"IsDefault": true,
|
||||||
|
"Index": 1,
|
||||||
|
"Score": 203
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Codec": "srt",
|
||||||
|
"Language": "eng",
|
||||||
|
"TimeBase": "1/1000000",
|
||||||
|
"localizedUndefined": "Undefined",
|
||||||
|
"localizedDefault": "Default",
|
||||||
|
"localizedForced": "Forced",
|
||||||
|
"DisplayTitle": "En - Default",
|
||||||
|
"BitRate": 92,
|
||||||
|
"IsDefault": true,
|
||||||
|
"Type": 2,
|
||||||
|
"Index": 2,
|
||||||
|
"Score": 6421,
|
||||||
|
"IsExternal": true,
|
||||||
|
"IsTextSubtitleStream": true,
|
||||||
|
"SupportsExternalStream": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"Bitrate": 2590008,
|
||||||
|
"DefaultAudioStreamIndex": 1,
|
||||||
|
"DefaultSubtitleStreamIndex": 2
|
||||||
|
}
|
Loading…
Reference in New Issue