我有工作解决方案从C++中的视频中提取帧github。问题是它非常缓慢。我正在做的是我正在使用定时器和播放视频,每当帧准备就绪时,我将它转换为位图并保存并寻找下一个位置。我认为这不是正确的做法,必须有另一种拉出框架的方式。请通过Github项目并建议任何更改。C++中的MFT帧提取
以下是我的定时器功能
if (m_spMediaEngine != nullptr)
{
LONGLONG pts;
if (m_spMediaEngine->OnVideoStreamTick(&pts) == S_OK)
{
// new frame available at the media engine so get it
ComPtr<ID3D11Texture2D> spTextureDst;
MEDIA::ThrowIfFailed(
m_d3dDevice->CreateTexture2D(
&CD3D11_TEXTURE2D_DESC(
DXGI_FORMAT_B8G8R8A8_UNORM,
m_rcTarget.right, // Width
m_rcTarget.bottom, // Height
1, // MipLevels
1, // ArraySize
D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET
),
nullptr,
&spTextureDst
)
);
if (FAILED(
m_spMediaEngine->TransferVideoFrame(spTextureDst.Get(), nullptr, &m_rcTarget, &m_bkgColor)
))
{
return;
}
Position = Position + interval;
SetPlaybackPosition(Position);
ComPtr<IDXGISurface2> surface;
MEDIA::ThrowIfFailed(
spTextureDst.Get()->QueryInterface(
__uuidof(IDXGISurface2), &surface)
);
D2D1_BITMAP_PROPERTIES1 bitmapProperties =
D2D1::BitmapProperties1(
D2D1_BITMAP_OPTIONS_TARGET | D2D1_BITMAP_OPTIONS_CANNOT_DRAW,
D2D1::PixelFormat(DXGI_FORMAT_B8G8R8A8_UNORM, D2D1_ALPHA_MODE_PREMULTIPLIED),
96,
96
);
m_d2dContext->CreateBitmapFromDxgiSurface(surface.Get(), &bitmapProperties, &bitmap);
SaveBitmapToFile();
}
}
我的问题是:这个权利,只提取帧的方法是什么?
问题是什么? – egur
“通过Github项目并提出任何更改”这不是StackOverflow的工作原理。您需要提出具体的问题,提供最好的解释和细节。然后你会得到答案。 –
@罗曼我已经提到,我如何提取框架和代码。如果有人对此感兴趣,那么他不必设置整个项目,他可以使用我的github项目 –