Silverlight媒体播放器与帧计数器

Him*_*ack 7 silverlight

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

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

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

Gon*_*ing 2

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)

注意:您不能保证显示每个帧数,因为帧速率并不完美,但您只能看到渲染的帧,所以这并不重要。您看到的帧将具有正确的帧编号。