我正在尝试编写一个简单的Silverlight媒体播放器,但我需要时间戳为hh:mm:ss:ff其中FF是帧数。
我使用计时器来获取刻度并计算我所在的帧,但它似乎非常不准确。 如何可靠地计算我所在的框架?
有没有人知道会有这样的免费Silverlight播放器?
答案 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);
}
}
}
}
注意:您无法保证显示每个帧编号,因为帧速率并不完美,但您只能看到渲染帧,因此无关紧要。您看到的帧将具有正确的帧编号。