silverlight   发布时间:2022-05-04  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Silverlight媒体播放器与帧计数器大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

我正在尝试编写一个简单的Silverlight媒体播放器,但我需要时间戳为hh:mm:ss:ff其中FF是帧数. 我使用计时器来获取刻度并计算我所在的帧,但它似乎非常不准确. 如何可靠地计算我所在的框架? 有谁知道一个免费的Silverlight播放器会这样做吗? Silverlight旨在以不规则的间隔进行更新,并将任何动画或媒体播放追溯到渲染下一帧时的当前经过时间. 要计算当前帧(帧只是一秒的
我正在尝试编写一个简单的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帧.

您需要使用双精度(或浮点数)和整数值的最终模数进行乘法运算,因此它在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媒体播放器与帧计数器全部内容,希望文章能够帮你解决Silverlight媒体播放器与帧计数器所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。