1

私は s のリストを持っていますKeyframe。これは TimeSpans を持つオブジェクトと、 という独自の timeSpan の目盛りを持つフィールド (タイプ long)tempTicksです。完全なリストはキーフレーム 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);
}

この方法では、すべてを正しく取得することはできません。理由がわかりますか?

例:映画の好きなシーンを撮る。最初に撮影した場所の 87:00 からではなく、メディア プレーヤーの 0:00 からシーンが始まるようにエクスポートしたいとします。

4

3 に答える 3

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);
于 2013-04-22T23:00:14.623 に答える
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値を直接計算できます。

于 2013-04-22T23:15:15.260 に答える
0

「i」の値は 300 から 799 のようです。<= 演算子が必要ですか?

于 2013-04-22T22:34:56.507 に答える