2013-04-22 85 views
1

我有一個Keyframe s的列表,它們只是TimeSpans的對象,而 是一個字段(類型long),它有自己的timeSpan的標記tempTicks。 完整列表從Keyframe 1 - 7000.計算TimeSpan的ticks

幾乎每個關鍵幀都有一個比以前更大的時間戳。 我想抓住300-800的關鍵幀,我想給他們 一個新的TimeSpan從0開始。

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

你的問題對我來說不是很清楚......你開始談論擁有時間跨度,然後開始引用時間戳。這兩者非常不同。時間跨度測量持續時間(即兩點之間),時間戳是單個時間點。是的,你只是在談論改變300-800的時間戳到0-500之間的任何東西?可能值得給出一些前後值的例子,以明確你想要的東西...... – Chris 2013-04-22 22:49:20

+1

也許時間跨度不是幀之間的時間,而是每幀從零開始的時間。 – 2013-04-22 22:52:45

+0

Sry Chris。我的意思是timeSpans。例如:現在在我的問題。 @Steve:時間跨度是相對於時間線 – 2013-04-22 22:53:37

回答

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); 
+0

您可以在初始化程序中設置屬性列表,也可以直接在關鍵幀上使用構造函數(但您沒有發佈該類,因此不知道它可能具有的其他值)。更新代碼以顯示如何設置其他屬性。 – 2013-04-22 23:11:33

+0

令人難以置信的東西男人!謝謝你的工作就像一陣微風。你能告訴我,像你這樣的人怎麼稱呼這種有效的製作清單的方式?我想了解它 – 2013-04-22 23:17:41

+2

它被稱爲LINQ。基本上只是擴展方法,可以讓你鏈接任何IEnumerable的操作。許多在線和MSDN上的示例。 – 2013-04-22 23:18:54

0

看起來像「我」的價值從300到799.你需要一個< =運營商?

+0

沒有真正改變任何東西 – 2013-04-22 22:37:14

+0

是clip.Keyframes基於零?如果是這樣,你真的在​​尋找299到799的「我」值嗎? – 2013-04-22 22:46:56

+0

是的,這有什麼關係? – 2013-04-22 22:49:08

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值上做數學運算。