添加包含帧的持续时间

时间:2018-12-22 14:59:33

标签: c# timespan

我的时长包含帧:

e.g1: 00:00:00:00
     hh:mm:ss:FR

FR-代表中东/亚洲地区为25帧的帧。

但是在C#中,它将最后一个FR作为秒(即60秒)。

 e.g2: 00:00:00:00
      DD:hh:mm:ss

现在如何在C#中添加e.g1

我可以用这种格式知道如何增加两个时长。

  TimeSpan t1 = TimeSpan.Parse(duration);
  TimeSpan t2 = TimeSpan.Parse("00:00:30:18");
  TimeSpan t3 = t1.Add(t2);

3 个答案:

答案 0 :(得分:2)

在这段时间内"00:00:30:18"被认为是毫秒而不是帧,因此Timespan.Duration对您不起作用,并且您需要自定义一些内容(用于显示可能会起作用,但不能加减):

public static class Extensions
{
    public static TimeSpan AddWithFrames(this TimeSpan x, TimeSpan ts)
    {
        int fr = ts.Seconds + x.Seconds;
        TimeSpan result = x.Add(ts).Add(new TimeSpan(0,0,fr/25,0));
        return new TimeSpan(result.Days, result.Hours, result.Minutes, fr % 25);
    }
}

并像这样使用它:

 TimeSpan t1 = TimeSpan.Parse(duration);
  TimeSpan t2 = TimeSpan.Parse("00:00:30:18");
  TimeSpan t3 = t1.AddWithFrames(t2);

答案 1 :(得分:2)

您可以使用一个自定义类来处理带有SMPTE时间码的操作。 您无需重新发明轮子,因为该项目可以处理所有不同类型的帧速率和帧丢失:

https://github.com/ailen0ada/Timecode4net

using Timecode4net;

var start = Timecode.FromString(input: "00:00:05:15", frameRate: FrameRate.fps25, isDropFrame: false);
var end = Timecode.FromString("00:00:10:22", FrameRate.fps25, false);
Console.WriteLine((end.TotalFrames - start.TotalFrames)/25.0);

给您5,28

答案 2 :(得分:0)

除非有人有更好的方法来简化此操作,否则这就是我的操作方法,请分享

            string timecode1 = "00:05:00:04";
            string timecode2 = "00:06:00:24";

            int   hours1 = Int32.Parse(timecode1.Substring(0,2))*90000;
            int   minutes1 =  Int32.Parse(timecode1.Substring(3, 2))*1500;
            int seconds1 = Int32.Parse(timecode1.Substring(6, 2))*25;
            int frames1 = Int32.Parse(timecode1.Substring(9, 2));

            int hours2 = Int32.Parse(timecode2.Substring(0, 2)) * 90000;
            int minutes2 = Int32.Parse(timecode2.Substring(3, 2)) * 1500;
            int seconds2 = Int32.Parse(timecode2.Substring(6, 2)) * 25;
            int frames2 = Int32.Parse(timecode2.Substring(9, 2));

            int time1 = hours1 + minutes1 + seconds1 + frames1;
            int time2 = hours2 + minutes2 + seconds2 + frames2;

            int totaltime = time1 + time2;

            int hours = totaltime / 90000;
           int minutes = ((totaltime % 90000)) / 1500;
            int seconds = ((totaltime % 90000) % 1500 )/ 25;
            int frames = ((totaltime % 90000) % 1500) % 25;