使用Microsoft Media Foundation,基于(https://docs.microsoft.com/zh-cn/windows/win32/medfound/how-to-play-unprotected-media-files)
“如何使用Media Foundation播放媒体文件”的例子。我希望定位到某一帧(或某个时间)并且定格在这一帧(或这个时间)。
我是这样做的:首先正常播放,然后暂停,然后使用了微软例程中的HRESULT SkipToPosition(MFTIME SeekTime),进行视频跳转到指定位置后,这样可以暂停在指定位置,但是视频窗口需要刷新时,使用IMFVideoDisplayControl::RepaintVideo() 返回值为S_OK,但无刷新效果。这是什么原因?如何修改?
HRESULT SkipToPosition (MFTIME SeekTime, IMFMediaSession *pMediaSession)
{
PROPVARIANT var;
PropVariantInit(&var);
IMFRateControl *pRateControl = NULL;
// Get the rate control service.
HRESULT hr = MFGetService(pMediaSession, MF_RATE_CONTROL_SERVICE, IID_PPV_ARGS(&pRateControl));
// Set the playback rate to zero without thinning.
if(SUCCEEDED(hr))
{
hr = pRateControl ->SetRate( FALSE, 0.0F);
}
// Create the Media Session start position.
if( SeekTime == PRESENTATION_CURRENT_POSITION )
{
var.vt = VT_EMPTY;
}
else
{
var.vt = VT_I8;
var.hVal.QuadPart = SeekTime;
}
// Start the Media Session.
if(SUCCEEDED(hr))
{
hr = pMediaSession->Start( NULL, &var);
}
// Clean up.
SafeRelease(&pRateControl);
PropVariantClear(&var)
return hr;
}
初始:
需刷新:
未正确刷新:
把你的显示卡的视频加速,directx设置中的2d 3d加速都先关闭了试试看。