我有一个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开始。
答案 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; =运算符吗?