2014-07-10 81 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/ –