我在做一个播放器自带解码库,在播放的时候需要每秒播放25帧图片,即40ms一帧,要准确的隔40ms,我目前了解到得方法有两个,一个是多媒体定时器TimeSetEvent,另一个就是sleep函数。sleep函数精确度不高放弃了,timesetevent函数在设置精度在5ms的情况下播放40W像素的视频CPU占得会很高,放弃了。让后我发现目前大多数的播放器也是没有用TimeSetEvent定时器的,我想知道他们是如何做到准确定时40ms的呢?
    求高人知道啊,我现在很苦恼啊 - -|||

解决方案 »

  1.   

    CPU占得会很高估计是你显示图片的方法不够好
      

  2.   

     
    不是啊 我把精度设为10ms的时候CPU就降下来了,所以不是显示图片的方法的问题 我用的是directdraw没有问题的
      关键是目前其他的大多数多媒体播放器的定时方法是什么?
      

  3.   

    http://hi.baidu.com/tr0j4n/blog/item/35d12b4df96479f0d72afcc4.html
      

  4.   

    directshow里是有一个所谓的质量控制机制(Quality control),在每个视频sample上会打上时间戳,filtergraph也有个参考时钟,当视频早到了就会等时间戳,等时间到了就播放,如果晚到了,则通知source加快发送速度。
    可参考以下代码
    // Quality control
    STDMETHODIMP CQQOutPin::Notify(IBaseFilter * pSender, Quality q)
    {
    // The sample is late to reach the renderer
    if (q.Late > 0)
    {
    CAutoLock   lock(&mSharedState);
    // Calculate the proper time at this moment
    mLastSampleTime += q.Late;
    mLastSampleTime += mSampleDuration;
    // Important: convert to the nearby frame boundary
    mLastSampleTime  = mLastSampleTime / mSampleDuration * mSampleDuration; long pos = mTotalFrames * mFrameSize * mLastSampleTime / m_rtDuration;
    pos += mHeaderSize;
    fseek(m_fp, pos, SEEK_SET); DbgLog((LOG_TRACE, 0, "Quality control seeking to : %10d", mLastSampleTime));
    }
    else
    {
    // The sample arrived early
    } return NOERROR;
    }
    具体的可以看下 DirectShow实务精选 Appendix_D
      

  5.   

    那么这样的话精度怎么样?source的发送速度是如何控制的?视频早到了在等时间戳的时候怎么知道什么时候时间到了可以播放了,一直不停的循环获取当前的时间么?
      

  6.   


    你说的是不是timeSetEvent函数?这个已经被我排除了我想知道的是像暴风影音、windows media、MPlayer、等等大多数播放器是如何做出控制的,它们的时间控制是不是很准确的?还是允许有误差的比如
    25帧频的时间间隔可以是32-48-36-44...这样的?
      

  7.   

    你先去学习下dshow吧,书上有说。