У меня есть рабочее решение для извлечения кадров из видео в C ++ на GitHub. Проблема в том, что он очень медленный. Я использую таймер и играю видео, и когда кадр готов, я преобразую его в растровое изображение, сохраняю и ищу следующую позицию. Это не правильный подход, я думаю, должен быть другой способ вытащить кадры. Пожалуйста, пройдите проект Github и предложите любые изменения.
ниже моя функция таймера
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();
}
}
Мой вопрос: это правильный и единственный способ извлечения кадров?
Я хотел бы сделать что-то вроде преобразования его в хэш-сумму и сохранения этого, что должно ускорить его. Например, вы можете создать класс для хранения конкретного экземпляра хэша (или создать связанный список для этих хэшей), а затем извлечь кадр и хэшировать его, используя dhash http://www.hackerfactor.com/blog/index.php?/archives/2013/01/21.html