C에서 비디오에서 프레임을 추출하는 솔루션을 가지고 있습니다 (github). 문제는 매우 느립니다. 내가하고있는 일은 타이머를 사용하고 비디오를 재생하고 프레임이 준비 될 때마다 비트 맵으로 변환하여 저장하고 다음 위치로 이동하는 것입니다. 이것은 내가 생각하는 바른 접근 방식이 아닙니다. 프레임을 꺼내는 또 다른 방법이 있어야합니다. Github 프로젝트를 통해 변경 사항을 제안하십시오. 오른쪽 프레임을 추출하는 유일한 방법은 이것이다 :CFT의 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 작동 방식이 아닙니다. 가장 좋은 설명과 세부 사항을 제공하면서 구체적인 질문을해야합니다. 그렇다면 대답을 얻습니다. –
@Roman 나는 프레임과 코드를 추출하는 방법에 대해 언급했다. 누군가가 관심이 있다면 전체 프로젝트를 설정할 필요가 없으며 github 프로젝트를 사용할 수 있습니다. –