Próbuję użyć MediaFoundation API do kodowania wideo, ale mam problemy z wypychaniem próbek do SinkWriter.Używanie Media Foundation do kodowania powierzchni Direct X
Otrzymuję ramki do kodowania za pomocą interfejsu Desktop Duplication API. W końcu otrzymuję ID3D11Texture2D z obrazem pulpitu.
Próbuję utworzyć IMFVideoSample zawierający tę powierzchnię, a następnie przesłać próbkę wideo do SinkWriter.
Próbowałem będzie o tym na różne sposoby:
Zadzwoniłem
MFCreateVideoSampleFromSurface(texture, &pSample)
gdzie tekstury jest ID3D11Texture2D, wypełniona w SampleTime i SampleDuration a następnie przekazywane utworzoną próbkę do SinkWriter.
SinkWriter zwrócił E_INVALIDARG.Próbowałem utworzyć próbkę, przekazując nullptr jako pierwszy argument i tworząc bufor samodzielnie za pomocą MFCreateDXGISurfaceBuffer, a następnie przekazując wynikowy bufor do Sample.
To też nie działa.Przeczytałem dokumentację MediaFoundation i nie mogłem znaleźć szczegółowych informacji o tym, jak utworzyć próbkę z tekstur DirectX.
Zabrakło rzeczy do wypróbowania.
Czy ktoś wcześniej korzystał z tego interfejsu API i może wymyślić rzeczy, które powinienem sprawdzić, lub w jaki inny sposób mogę to debugować?
Myślę, że popełniłeś błąd przy użyciu 'MFCreateVideoSampleFromSurface' i' MFCreateDXGISurfaceBuffer'.Funkcja ta tworzy bufory do zapisu na powierzchni DirectX i wizualizacji oraz tworzy obiekty z interfejsem 'IMF2DBuffer', ale kodery i programy piszące potrzebują obiektów z' IMFMediaBuffer'. Nie mogą zrozumieć "IMF2DBuffer". Spróbuj użyć funkcji "MFCreateSampleCopierMFT" - utworzyła obiekt MFT do kopiowania z 'IMFMediaBuffer' do' IMF2DBuffer' na [MSDN] (https://msdn.microsoft.com/en-us/library/windows/desktop/dd388101 (v = vs.85) .aspx). Może być w stanie przerobić pracę!?! –
Jesteś tego pewien? Przeglądając dokumentację dla 'MFCreateDXGISurfaceBuffer', stwierdza on, że zwraca wskaźnik do IMFMediaBuffer. –
Możesz spróbować uzyskać dane przez 'IMFMediaBuffer' bufora z' MFCreateDXGISurfaceBuffer'. –