计算TimeSpan的滴答

时间:2013-04-22 22:24:28

标签: c#

我有一个Keyframe的列表,它们只是TimeSpans和的对象 一个字段(类型为long),它有自己的timeSpan的标记,称为tempTicks。 完整列表来自Keyframe 1 - 7000。

几乎每个关键帧都有比以前更大的时间戳。 我想抓住300-800的关键帧,我想给他们 从0刻度开始的新TimeSpan。

List<Keyframe> region = new List<Keyframe>();

long highestTicks = 0;
long durationTicks = 0; //Stores the whole duration of this new region

//beginFrame and endFrame are 300 and 800
for (int i = beginFrame; i < endFrame; i += 1)
{
    //Clip is the full list of keyframes
    Keyframe k = clip.Keyframes[i];
    if (region.Count < 1)
    {
        k.Time = TimeSpan.FromTicks(0);
    }
    else
    {
        //This is the trouble-part
        if (k.Time.Ticks > highestTicks)
        {
           highestTicks = k.Time.Ticks;
           k.Time = 
           TimeSpan.FromTicks(highestTicks - region[region.Count -1].tempTicks);
        }

     }
     durationTicks += k.Time.Ticks;
     region.Add(k);
}

我没有这样正确地得到所有这些。 你知道为什么吗?

示例:拍摄喜欢的电影场景。您希望以场景从媒体播放器中的0:00开始的方式导出,而不是从最初拍摄场景的87:00开始。

3 个答案:

答案 0 :(得分:4)

尝试以下几点:

var tickOffset = clip.Keyframes[beginFrame].Time.Ticks;
// this is your 'region' variable
var adjustedFrames = clip.Keyframes
    .Skip(beginFrame)
    .Take(endFrame - beginFrame)
    .Select(kf => new Keyframe { 
        Time = TimeSpan.FromTicks(kf.Time.Ticks - tickOffset),
        OtherProperty = kf.OtherProperty            
    })
    .ToList();
var durationTicks = adjustedFrames.Max(k => k.Time.Ticks);

答案 1 :(得分:1)

在原地修改这些帧的时间有点奇怪。可以预期您将它们提取到新列表而不是修改原始值。然而,这样做的方法是使用第一个字段作为“基础”,并从所有其他字段中减去该值。因此,如果您的时间为[..., 27, 28, 32, 33, 35, 37, 39, ...],并且您希望将值从27更改为39,那么它们将变为:[0, 1, 5, 6, 8, 10, 12]

List<Keyframe> region = new List<Keyframe>();

long highestTicks = 0;
long durationTicks = 0; //Stores the whole duration of this new region

long baseTicks = clip.Keyframes[beginFrame].Time.Ticks;

//beginFrame and endFrame are 300 and 800
for (int i = beginFrame; i <= endFrame; i += 1)
{
    //Clip is the full list of keyframes
    Keyframe k = clip.Keyframes[i];
    k.Time = TimeSpan.FromTicks(k.Time.Ticks - baseTicks);
    highestTicks = Math.Max(highestTicks, k.Time.Ticks);

     region.Add(k);
}

durationTicks = highestTicks;

虽然我真的不明白你为什么担心蜱虫。您可以直接对TimeSpan值进行数学计算。

答案 2 :(得分:0)

看起来“i”值的运行范围是300到799.你需要一个&lt; =运算符吗?