diff --git a/FFMpegCore.Test/VideoTest.cs b/FFMpegCore.Test/VideoTest.cs index fd34adc..819fb3a 100644 --- a/FFMpegCore.Test/VideoTest.cs +++ b/FFMpegCore.Test/VideoTest.cs @@ -260,7 +260,11 @@ public void Video_Join() var result = Encoder.Join(output, input, input2); Assert.IsTrue(File.Exists(output.FullName)); - Assert.AreEqual(input.Duration.TotalSeconds * 2, result.Duration.TotalSeconds); + TimeSpan expectedDuration = input.Duration * 2; + Assert.AreEqual(expectedDuration.Days, result.Duration.Days); + Assert.AreEqual(expectedDuration.Hours, result.Duration.Hours); + Assert.AreEqual(expectedDuration.Minutes, result.Duration.Minutes); + Assert.AreEqual(expectedDuration.Seconds, result.Duration.Seconds); Assert.AreEqual(input.Height, result.Height); Assert.AreEqual(input.Width, result.Width); } @@ -319,7 +323,7 @@ public void Video_With_Only_Audio_Should_Extract_Metadata() Assert.AreEqual(79.5, video.Duration.TotalSeconds, 0.5); Assert.AreEqual(1.25, video.Size); } - + [TestMethod] public void Video_Duration() { var video = VideoInfo.FromFileInfo(VideoLibrary.LocalVideo); @@ -335,7 +339,11 @@ public void Video_Duration() { Assert.IsTrue(File.Exists(output.FullName)); var outputVideo = new VideoInfo(output.FullName); - Assert.AreEqual(video.Duration.TotalSeconds - 5, outputVideo.Duration.TotalSeconds); + + Assert.AreEqual(video.Duration.Days, outputVideo.Duration.Days); + Assert.AreEqual(video.Duration.Hours, outputVideo.Duration.Hours); + Assert.AreEqual(video.Duration.Minutes, outputVideo.Duration.Minutes); + Assert.AreEqual(video.Duration.Seconds - 5, outputVideo.Duration.Seconds); } finally { if (File.Exists(output.FullName)) output.Delete(); diff --git a/FFMpegCore/FFMPEG/FFMpegStreamMetadata.cs b/FFMpegCore/FFMPEG/FFMpegStreamMetadata.cs index 68269cf..3a85b7a 100644 --- a/FFMpegCore/FFMPEG/FFMpegStreamMetadata.cs +++ b/FFMpegCore/FFMPEG/FFMpegStreamMetadata.cs @@ -31,6 +31,15 @@ internal class Stream [JsonProperty("r_frame_rate")] internal string FrameRate { get; set; } + + [JsonProperty("tags")] + internal Tags Tags { get; set; } + } + + internal class Tags + { + [JsonProperty("DURATION")] + internal string Duration { get; set; } } internal class FFMpegStreamMetadata diff --git a/FFMpegCore/FFMPEG/FFProbe.cs b/FFMpegCore/FFMPEG/FFProbe.cs index 5002817..1329b3c 100644 --- a/FFMpegCore/FFMPEG/FFProbe.cs +++ b/FFMpegCore/FFMPEG/FFProbe.cs @@ -81,9 +81,20 @@ private VideoInfo ParseVideoInfoInternal(VideoInfo info, string probeOutput) double videoSize = 0d; double audioSize = 0d; - var duration = TimeSpan.FromSeconds(double.TryParse((video ?? audio).Duration, NumberStyles.Any, CultureInfo.InvariantCulture, out var output) ? output : 0); - info.Duration = duration.Subtract(TimeSpan.FromMilliseconds(duration.Milliseconds)); - + string sDuration = (video ?? audio).Duration; + TimeSpan duration = TimeSpan.Zero; + if (sDuration != null) + { + duration = TimeSpan.FromSeconds(double.TryParse(sDuration, NumberStyles.Any, CultureInfo.InvariantCulture, out var output) ? output : 0); + } + else + { + sDuration = (video ?? audio).Tags.Duration; + if (sDuration != null) + TimeSpan.TryParse(sDuration.Remove(sDuration.LastIndexOf('.') + 8), CultureInfo.InvariantCulture, out duration); // TimeSpan fractions only allow up to 7 digits + } + info.Duration = duration; + if (video != null) { var bitRate = Convert.ToDouble(video.BitRate, CultureInfo.InvariantCulture);