Добавление длительности, содержащей кадры - PullRequest
0 голосов
/ 22 декабря 2018

У меня есть продолжительность, которая содержит кадры:

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

Теперь, как мне добавить e.g1 в C #

Могу ли я узнать, используя этот формат, как добавить две длительности.

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

Ответы [ 3 ]

0 голосов
/ 22 декабря 2018

вы можете использовать пользовательский класс, который обрабатывает операции с временными кодами 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

0 голосов
/ 23 декабря 2018

Вот как я это сделал, если у кого-то нет лучшего способа упростить это, пожалуйста, поделитесь

            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;
0 голосов
/ 22 декабря 2018

в этой длительности "00:00:30:18" 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);
...