none
有关silverlight 流媒体帧精度的几个问题 RRS feed

  • 问题

  • 第一个问题:流媒体服务器是否支持帧精度,有没有官方文档明确讲解过? 以前一直没关注过这方面的事 找了一堆资料,对这方面还是没有帮助。 第二个问题:silverlight 客户端如何支持帧精度? 我在api中找到MediaElement positon属性可以精确到毫秒的小数,也就是说如果我有个文件25帧,那么以1000毫秒/25=40毫秒为一帧的时间长度,但是我把每一秒的呈现帧数显示出来之后发现,一个文件并不全是25帧,总会有些偏差一两帧的情况,这样我再以40毫秒为一帧不就出现偏差了吗,也就是说不能精确到某一帧了。那该怎么去确定一帧呢?
    2010年1月20日 13:05

全部回复

  • 第一个问题:流媒体服务器是否支持帧精度,有没有官方文档明确讲解过?以前一直没关注过这方面的事 找了一堆资料,对这方面还是没有帮助。 第二个问题:silverlight 客户端如何支持帧精度? 我在api中找到MediaElement positon属性可以精确到毫秒的小数,也就是说如果我有个文件25帧,那么以1000毫秒/25=40毫秒为一帧的时间长度,但是我把每一秒的呈现帧数显示出来之后发现,一个文件并不全是25帧,总会有些偏差一两帧的情况,这样我再以40毫秒为一帧不就出现偏差了吗,也就是说不能精确到某一帧了。那该怎么去确定一帧呢?

    不直接支持,只能用毫秒,固定视频的NTSC或PAL制式后换算


    不过精度不能完全保证。

    My blog: http://blog.csdn.net/dotfun http://dotfun.cnblogs.com

    My contact: QQ:372900288 E-mail:372900288@qq.com msn:sellnet007@hotmail.com


    《银光志--Silverlight 3.0开发详解与最佳实践》
    2010年1月20日 13:56
    版主
  • 要是固定了某一个视频文件是25的话倒是可以在seek某一帧的时候在时间上加上一个固定或者可变的很短时间,这个时间在呈现一个帧的时间范围之内,比如我要找第二帧,如果帧率稳定, 可以直接1*40,得到第二帧的时间,现在就是1*(40+var),虽然不是在这一帧的起始处,不过也是在这帧的呈现时间段内,就可以精确定位到了,这样的话有个问题就是 23/帧秒或者24帧/秒,是平均分配每帧呈现时间的吗? 也就是说本来每秒平均分配25个时间段呈现25帧,现在少了2帧,就会是每秒平均分成了23个时间段?
    2010年1月21日 12:29
  • 要是固定了某一个视频文件是25的话倒是可以在seek某一帧的时候在时间上加上一个固定或者可变的很短时间,这个时间在呈现一个帧的时间范围之内,比如我要找第二帧,如果帧率稳定,可以直接1*40,得到第二帧的时间,现在就是1*(40+var),虽然不是在这一帧的起始处,不过也是在这帧的呈现时间段内,就可以精确定位到了,这样的话有个问题就是 23/帧秒或者24帧/秒,是平均分配每帧呈现时间的吗? 也就是说本来每秒平均分配25个时间段呈现25帧,现在少了2帧,就会是每秒平均分成了23个时间段?

    这要你自己去试试,你最好COPY上来具体的Code。

    My blog: http://blog.csdn.net/dotfun http://dotfun.cnblogs.com

    My contact: QQ:372900288 E-mail:372900288@qq.com msn:sellnet007@hotmail.com


    《银光志--Silverlight 3.0开发详解与最佳实践》
    2010年1月21日 15:36
    版主
  • 这个计算方法应该是考虑错了,开始我是从播放一个本地文件输出MediaElement 的RenderedFramesPerSecond 来认为每秒多少帧的,但是用了几个测试文件每秒帧的软件测试文件每秒25帧确实是固定的
    那么这个MediaElement 的RenderedFramesPerSecond代表的是什么?而且通过下面代码测试,都会出现26帧的情况,什么原因呢?
    public MainPage()
    {
    InitializeComponent();
    this.Loaded += new RoutedEventHandler(VideoPlayer_Loaded);
    }
    void VideoPlayer_Loaded(object sender, RoutedEventArgs e)
    {
    // 每 1000 毫秒调用一次指定的方法
    _timer.Interval = TimeSpan.FromMilliseconds(1000);
    _timer.Tick += new EventHandler(_timer_Tick);
    _timer.Start();
    } void _timer_Tick(object sender, EventArgs e)
    {
    if (mediaElement.CurrentState == MediaElementState.Playing )
    {
    renderFameNum.Text = renderFameNum.Text+"\n"+string.Format(
    "{0}{1:00}:{2:00}:{3:00}:{4} :呈现帧数:{5}",
    "当前秒:",
    mediaElement.Position.Hours,
    mediaElement.Position.Minutes,
    mediaElement.Position.Seconds, mediaElement.Position.Milliseconds / 40, mediaElement.RenderedFramesPerSecond.ToString());
    dropFrameNum.Text = dropFrameNum.Text + "\n" + string.Format(
    "{0}{1:00}:{2:00}:{3:00}:{4} :丢失帧数:{5}",
    "当前秒:",
    mediaElement.Position.Hours,
    mediaElement.Position.Minutes,
    mediaElement.Position.Seconds, mediaElement.Position.Milliseconds / 40, mediaElement.DroppedFramesPerSecond.ToString());
    }
    // DroppedFramesPerSecond - 媒体每秒正在丢弃的帧数
    }
    2010年1月25日 3:59