gpt4 book ai didi

带帧计数器的 Silverlight 媒体播放器

转载 作者:行者123 更新时间:2023-12-04 12:49:23 26 4
gpt4 key购买 nike

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

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

有谁知道可以做到这一点的免费 Silverlight 播放器?

最佳答案

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

要计算当前帧(一帧只是一秒的特定分数),只需将自播放开始以来的总耗时乘以视频中编码的每秒帧数,然后找到余数该秒内的帧数以获取当前帧。

例如
当前帧 = (Elapsed-Time-in-seconds * FramesPerSecond) % FramesPerSecond;


因此,如果 20.12 秒过去了,那么在每秒 24 帧的视频中,您处于第 482 帧(实际上是 482.88,但只有整个帧很重要)。

以每秒帧数取其模数,您将获得剩余的帧数(例如 2),因此您位于第二个 20(或 00:00:20:02)中的第 2 帧。

您需要使用 double 数(或浮点数)和整数值的最终模数进行乘法,因此在 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);
}
}
}
}

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

关于带帧计数器的 Silverlight 媒体播放器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6786712/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com