我正在尝试编写一个简单的Silverlight媒体播放器,但我需要时间戳为hh:mm:ss:ff其中FF是帧数.
我使用计时器来获取刻度并计算我所在的帧,但它似乎非常不准确.如何可靠地计算我所在的框架?
有没有人知道会有这样的免费Silverlight播放器?
Silverlight 旨在以不规则的时间间隔进行更新,并在渲染下一帧时赶上当前播放时间的任何动画或媒体。
要计算当前帧(一帧只是一秒的特定部分),只需将自播放开始以来的总运行时间乘以视频中编码的每秒帧数,然后找到余数即可该秒内的帧数以获取当前帧。
例如,当前帧 =(经过的时间(以秒为单位)* FramesPerSecond)% FramesPerSecond;
因此,如果经过 20.12 秒,在每秒 24 帧的视频中,您将处于第 482 帧(实际上是 482.88,但只有整个帧才重要)。
将其模数除以每秒帧数,您将得到剩余的帧数(例如 2),因此您位于第 20 秒的第 2 帧(或 00:00:20:02)。
您需要使用双精度数(或浮点数)和整数值的最终模数进行乘法,因此在 C# 代码中将如下所示:
int framesPerSecond = 24; // for example
double elapsedTimeInSeconds = ...; /// Get the elapsed time...
int currentFrame = ((int)(elapsedTimeInSeconds * (double)framesPerSecond)) % framesPerSecond;
Run Code Online (Sandbox Code Playgroud)
由于问题已更改(在评论中)为分数帧速率,数学将按照此控制台应用程序进行:
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);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
注意:您不能保证显示每个帧数,因为帧速率并不完美,但您只能看到渲染的帧,所以这并不重要。您看到的帧将具有正确的帧编号。
| 归档时间: |
|
| 查看次数: |
959 次 |
| 最近记录: |