Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带帧计数器的Silverlight媒体播放器_Silverlight - Fatal编程技术网

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

带帧计数器的Silverlight媒体播放器,silverlight,Silverlight,我正在尝试编写一个简单的Silverlight媒体播放器,但我需要时间戳为hh:mm:ss:ff,其中ff是帧计数 我用了一个计时器来获取滴答声并计算我所处的帧,但它似乎非常不准确。 如何可靠地计算我所处的帧 有谁知道一个免费的Silverlight玩家会这么做 Silverlight设计用于不定期更新,并在渲染下一帧时捕捉播放到当前经过时间的任何动画或媒体 要计算当前帧(一帧只是一秒钟的特定分数),只需将自播放开始以来的总运行时间乘以视频中编码的每秒帧数,然后查找该秒钟内的剩余帧即可获得当前帧

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

我用了一个计时器来获取滴答声并计算我所处的帧,但它似乎非常不准确。 如何可靠地计算我所处的帧


有谁知道一个免费的Silverlight玩家会这么做

Silverlight设计用于不定期更新,并在渲染下一帧时捕捉播放到当前经过时间的任何动画或媒体

要计算当前帧(一帧只是一秒钟的特定分数),只需将自播放开始以来的总运行时间乘以视频中编码的每秒帧数,然后查找该秒钟内的剩余帧即可获得当前帧

例如。 当前帧=(已用时间,以秒为单位*FramesPerSecond)%FramesPerSecond

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

以每秒帧数取其模数,得到剩余帧数(例如2),因此第二个数字20(或00:00:20:02)中的第2帧

您需要使用双数值(或浮点)和整数上的最终模量进行乘法,这样在C#代码中会出现这种情况:

由于问题(在评论中)已更改为分数帧速率,因此数学结果将与此控制台应用程序一致:

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);
            }
        }
    }
}
使用系统;
命名空间时间测试
{
班级计划
{
静态void Main(字符串[]参数)
{
双帧秒=29.97;
对于(双elapsedTime=0;elapsedTime<5;elapsedTime+=0.01)
{
int currentFrame=(int)((elapsedTime*framesPerSecond)%framesPerSecond);
WriteLine(“时间:{0}=Frame:{1}”,elapsedTime,currentFrame);
}
}
}
}

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

将FPS相乘是非常抽象的说法。在这个位置乘多少次???谢谢。我已经做了一个类似的公式,用滴答而不是秒来跳水。但都一样。我在使用你的公式时遇到了我已经遇到过的同样问题,当前帧最终是双倍的,当它达到类似帧20.48的程度后,实际帧落后于1。。。这是因为它的累积偏移量,并且在电影时间内被拖动。。。然后有一个1-2的大偏移量frames@Himberjack:如果2帧差中的一帧对你的应用如此重要,你可能需要重新考虑交付方法。在Silverlight(以及其他基于web的视频播放器)中,帧偶尔会被丢弃。你想解决的实际问题是什么?我想在网站上做字幕编辑。。当使用24/25的FPS时,您的解决方案是可行的,但在29.97中它确实有点古怪。我已经更新了答案,包括分数帧速率的数学(我忘记了C中的模数也适用于双倍):)这个版本现在应该适用于任何情况,但模数可能会引入一个轻微的舍入误差。谢谢,但它仍然没有帮助。。。我因你的好意帮助而赏金。我认为这毕竟是一种限制
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);
            }
        }
    }
}