我的时长包含帧:
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);
答案 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;