2016-07-25 24 views
5

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ć?

+0

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ę!?! –

+0

Jesteś tego pewien? Przeglądając dokumentację dla 'MFCreateDXGISurfaceBuffer', stwierdza on, że zwraca wskaźnik do IMFMediaBuffer. –

+0

Możesz spróbować uzyskać dane przez 'IMFMediaBuffer' bufora z' MFCreateDXGISurfaceBuffer'. –

Odpowiedz

1

Przede wszystkim powinieneś nauczyć się używać mftrace tool. Bardzo prawdopodobne, że od razu rozwiąże problem.

Ale zgaduję, że następujące problemy są prawdopodobne.

  1. Prawdopodobnie, niektóre inne atrybuty są wymagane oprócz SampleTime/SampleDuration.

  2. Prawdopodobnie SinkWriter potrzebuje tekstury, którą może odczytać na procesorze. Aby to naprawić, gdy dostępna jest ramka, utwórz teksturę pomostową o tym samym formacie + rozmiarze, wywołaj funkcję CopyResource, aby skopiować pulpit do tekstury przemieszczania, a następnie przenieś tę warstwę pomostową do formatu MF.

  3. Nawet jeśli używasz sprzętowego kodera, więc procesor nigdy nie próbuje odczytać danych tekstury, nie sądzę, że dobrym pomysłem jest bezpośrednie przekazanie tekstury pulpitu do MF.

Po ustawieniu tekstury D3D dla próbki, żadne dane nie są kopiowane w dowolnym miejscu, próbka zachowuje jedynie teksturę.

MF działa asynchronicznie, może buforować kilka próbek w swoich węzłach topologii, jeśli chce.

DD przesyła dane synchronicznie, możesz uzyskać dostęp do tekstury między połączeniami AcquireNextFrame i ReleaseFrame.

+0

Próbowałem nie bagatelizować pytania zbyt wieloma szczegółami, ale kopiuję teksturę pulpitu przed przekazaniem go do MF, pobierając deskryptor tekstury pulpitu i tworząc nową teksturę za pomocą tego przed użyciem CopyResource. Ale dzięki lor dla wskaźnika mftrace, przyjrzę to. –

+0

Użyłem mfctrace i zorientowałem się, że próbki wysyłane do zlewu są zgłaszane jako mające rozmiar 0B, więc coś jest nie tak z ich tworzeniem. –

Powiązane problemy