2014-07-10 84 views
-1

我有工作解决方案从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(); 
    } 
} 

我的问题是:这个权利,只提取帧的方法是什么?

+1

问题是什么? – egur

+6

“通过Github项目并提出任何更改”这不是StackOverflow的工作原理。您需要提出具体的问题,提供最好的解释和细节。然后你会得到答案。 –

+0

@罗曼我已经提到,我如何提取框架和代码。如果有人对此感兴趣,那么他不必设置整个项目,他可以使用我的github项目 –

回答

0

我会沿着把它转换成一个hashsum并存储它,这应该加快它的行。例如,您可以创建一个类来容纳哈希的特定实例(或为这些哈希创建链接列表),然后提取一个帧并使用dhash对其进行哈希http://www.hackerfactor.com/blog/index.php?/archives/2013/01/21.html

+0

嗨,我不想比较和提取图像,我只想每隔1秒后提取帧。并将它们显示在列表中,以便用户可以在任何视频帧中进行搜索。 http://postimg.org/image/i1w5b90i7/ –