Silverlight媒体播放器与帧计数器

时间:2011-07-22 07:05:17

标签: silverlight

我正在尝试编写一个简单的Silverlight媒体播放器,但我需要时间戳为hh:mm:ss:ff其中FF是帧数。

我使用计时器来获取刻度并计算我所在的帧,但它似乎非常不准确。 如何可靠地计算我所在的框架?

有没有人知道会有这样的免费Silverlight播放器?

1 个答案:

答案 0 :(得分:2)

Silverlight旨在以不规则的间隔进行更新,并将任何动画或媒体播放追溯到渲染下一帧时的当前经过时间。

要计算当前帧(帧只是一秒的特定小部分),只需将已用总时间乘以自播放开始,通过视频中编码的帧/秒的数量,然后在该秒内找到帧的余数以获得当前帧。

<强> e.g。 当前帧=(Elapsed-Time-in-seconds * FramesPerSecond)%FramesPerSecond;

因此,如果20.12秒已经过去,在每秒24帧的视频上,你在第482帧(实际上是482.88,但只有整帧很重要)。

以每秒帧数为单位获取模数,然后得到剩余的帧数(例如2),这样你就可以在第二个数字20(或00:00:20:02)中的第2帧。< / p>

你需要使用双精度(或浮点数)和整数值的最终模数进行乘法运算,所以它在C#代码中就像这样:

int framesPerSecond = 24; // for example
double elapsedTimeInSeconds = ...; /// Get the elapsed time...
int currentFrame = ((int)(elapsedTimeInSeconds * (double)framesPerSecond)) % framesPerSecond;

由于问题已经改变(在评论中)到小数帧速率,因此数学将按照此控制台应用程序进行:

using System;

namespace TimeTest
{
    class Program
    {
        static void Main(string[] args)
        {
            double framesPerSecond = 29.97;

            for (double elapsedTime = 0; elapsedTime < 5; elapsedTime+=0.01)
            {
                int currentFrame = (int)((elapsedTime*framesPerSecond) % framesPerSecond);
                Console.WriteLine("Time: {0} = Frame: {1}", elapsedTime, currentFrame);
            }
        }
    }
}

注意:您无法保证显示每个帧编号,因为帧速率并不完美,但您只能看到渲染帧,因此无关紧要。您看到的帧将具有正确的帧编号。