diff --git a/FFMpegCore.Test/FFProbeTests.cs b/FFMpegCore.Test/FFProbeTests.cs index 7af92cd..91411d4 100644 --- a/FFMpegCore.Test/FFProbeTests.cs +++ b/FFMpegCore.Test/FFProbeTests.cs @@ -114,5 +114,14 @@ public async Task Probe_Success_Subtitle_Async() Assert.AreEqual(0, info.AudioStreams.Count); Assert.AreEqual(0, info.VideoStreams.Count); } + + [TestMethod, Timeout(10000)] + public async Task Probe_Success_Disposition_Async() + { + var info = await FFProbe.AnalyseAsync(TestResources.Mp4Video); + Assert.IsNotNull(info.PrimaryAudioStream); + Assert.AreEqual(1, info.PrimaryAudioStream.Disposition["default"]); + Assert.AreEqual(0, info.PrimaryAudioStream.Disposition["forced"]); + } } } \ No newline at end of file diff --git a/FFMpegCore/FFProbe/FFProbeAnalysis.cs b/FFMpegCore/FFProbe/FFProbeAnalysis.cs index 1997cc3..2177307 100644 --- a/FFMpegCore/FFProbe/FFProbeAnalysis.cs +++ b/FFMpegCore/FFProbe/FFProbeAnalysis.cs @@ -12,7 +12,7 @@ public class FFProbeAnalysis public Format Format { get; set; } = null!; } - public class FFProbeStream : ITagsContainer + public class FFProbeStream : ITagsContainer, IDispositionContainer { [JsonPropertyName("index")] public int Index { get; set; } @@ -71,9 +71,13 @@ public class FFProbeStream : ITagsContainer [JsonPropertyName("sample_rate")] public string SampleRate { get; set; } = null!; + [JsonPropertyName("disposition")] + public Dictionary Disposition { get; set; } = null!; + [JsonPropertyName("tags")] public Dictionary Tags { get; set; } = null!; } + public class Format : ITagsContainer { [JsonPropertyName("filename")] @@ -110,10 +114,16 @@ public class Format : ITagsContainer public Dictionary Tags { get; set; } = null!; } + public interface IDispositionContainer + { + Dictionary Disposition { get; set; } + } + public interface ITagsContainer { Dictionary Tags { get; set; } } + public static class TagExtensions { private static string? TryGetTagValue(ITagsContainer tagsContainer, string key) @@ -127,7 +137,18 @@ public static class TagExtensions public static string? GetCreationTime(this ITagsContainer tagsContainer) => TryGetTagValue(tagsContainer, "creation_time "); public static string? GetRotate(this ITagsContainer tagsContainer) => TryGetTagValue(tagsContainer, "rotate"); public static string? GetDuration(this ITagsContainer tagsContainer) => TryGetTagValue(tagsContainer, "duration"); - - + } + + public static class DispositionExtensions + { + private static int? TryGetDispositionValue(IDispositionContainer dispositionContainer, string key) + { + if (dispositionContainer.Disposition != null && dispositionContainer.Disposition.TryGetValue(key, out var dispositionValue)) + return dispositionValue; + return null; + } + + public static int? GetDefault(this IDispositionContainer tagsContainer) => TryGetDispositionValue(tagsContainer, "default"); + public static int? GetForced(this IDispositionContainer tagsContainer) => TryGetDispositionValue(tagsContainer, "forced"); } } diff --git a/FFMpegCore/FFProbe/MediaAnalysis.cs b/FFMpegCore/FFProbe/MediaAnalysis.cs index aea714c..174eb7e 100644 --- a/FFMpegCore/FFProbe/MediaAnalysis.cs +++ b/FFMpegCore/FFProbe/MediaAnalysis.cs @@ -67,6 +67,7 @@ private VideoStream ParseVideoStream(FFProbeStream stream) PixelFormat = stream.PixelFormat, Rotation = (int)float.Parse(stream.GetRotate() ?? "0"), Language = stream.GetLanguage(), + Disposition = stream.Disposition, Tags = stream.Tags, }; } @@ -87,6 +88,7 @@ private AudioStream ParseAudioStream(FFProbeStream stream) SampleRateHz = !string.IsNullOrEmpty(stream.SampleRate) ? MediaAnalysisUtils.ParseIntInvariant(stream.SampleRate) : default, Profile = stream.Profile, Language = stream.GetLanguage(), + Disposition = stream.Disposition, Tags = stream.Tags, }; } @@ -101,6 +103,7 @@ private SubtitleStream ParseSubtitleStream(FFProbeStream stream) CodecLongName = stream.CodecLongName, Duration = MediaAnalysisUtils.ParseDuration(stream), Language = stream.GetLanguage(), + Disposition = stream.Disposition, Tags = stream.Tags, }; } diff --git a/FFMpegCore/FFProbe/MediaStream.cs b/FFMpegCore/FFProbe/MediaStream.cs index 22186c5..9681ac9 100644 --- a/FFMpegCore/FFProbe/MediaStream.cs +++ b/FFMpegCore/FFProbe/MediaStream.cs @@ -15,8 +15,9 @@ public class MediaStream public int BitRate { get; internal set; } public TimeSpan Duration { get; internal set; } public string? Language { get; internal set; } + public Dictionary? Disposition { get; internal set; } public Dictionary? Tags { get; internal set; } - + public Codec GetCodecInfo() => FFMpeg.GetCodec(CodecName); } } \ No newline at end of file