我在做一个播放器自带解码库,在播放的时候需要每秒播放25帧图片,即40ms一帧,要准确的隔40ms,我目前了解到得方法有两个,一个是多媒体定时器TimeSetEvent,另一个就是sleep函数。sleep函数精确度不高放弃了,timesetevent函数在设置精度在5ms的情况下播放40W像素的视频CPU占得会很高,放弃了。让后我发现目前大多数的播放器也是没有用TimeSetEvent定时器的,我想知道他们是如何做到准确定时40ms的呢?
求高人知道啊,我现在很苦恼啊 - -|||
求高人知道啊,我现在很苦恼啊 - -|||
不是啊 我把精度设为10ms的时候CPU就降下来了,所以不是显示图片的方法的问题 我用的是directdraw没有问题的
关键是目前其他的大多数多媒体播放器的定时方法是什么?
可参考以下代码
// 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
你说的是不是timeSetEvent函数?这个已经被我排除了我想知道的是像暴风影音、windows media、MPlayer、等等大多数播放器是如何做出控制的,它们的时间控制是不是很准确的?还是允许有误差的比如
25帧频的时间间隔可以是32-48-36-44...这样的?