2016-01-13 49 views
6

Próbuję napisać aplikację, która przechwyci strumień wideo z ekranu i wyśle ​​go do klienta zdalnego. Odkryłem, że najlepszym sposobem przechwytywania ekranu w systemie Windows jest użycie DXGI Desktop Duplication API (dostępnego od Windows 8). Firma Microsoft zapewnia zgrabny kod sample, który przesyła zduplikowane klatki do ekranu. Zastanawiałem się, jaki jest najprostszy, ale wciąż stosunkowo szybki sposób kodowania tych ramek i wysyłania ich przez sieć.DXGI Desktop Duplikacja: kodowanie ramek, aby wysłać je przez sieć

Ramki pochodzą z AcquireNextFrame z powierzchnią zawierającą mapę bitową na pulpicie i metadane, które zawierają zmienione obszary przenoszenia i przenoszenia. Stąd mam kilka opcji:

  1. wyodrębnić bitmapy z powierzchni DirectX, a następnie użyć zewnętrznej biblioteki jak ffmpeg zakodować serię bitmap do H.264 i wysłać go na RTSP. Mówiąc wprost, obawiam się, że ta metoda będzie zbyt powolna, ponieważ nie korzysta z żadnych natywnych metod Windows. Konwertowanie tekstury D3D na mapę bitową kompatybilną z ffmpeg wydaje się niepotrzebną pracą.
  2. From this answer: przekształć teksturę D3D na IMFrash i użyj kodowania MediaFoundation SinkWriter do kodowania ramki. Znalazłem this tutorial kodowania wideo, ale nie znalazłem jeszcze sposobu na natychmiastowe uzyskanie zakodowanej ramki i wysłanie jej zamiast zrzucania wszystkich plików wideo.

Ponieważ nie zrobiłem czegoś takiego wcześniej, pytam, czy zmierzam w dobrym kierunku. Na koniec chcę mieć prosty strumień wideo przechwytywania pulpitu, najlepiej o małym opóźnieniu, który mogę oglądać ze zdalnego urządzenia.

Zastanawiam się również, czy mogę skorzystać z brudnych i przesunąć regionów dostarczonych przez Desktop Duplication. Zamiast kodować ramkę, mogę wysłać je przez sieć i wykonać przetwarzanie po stronie klienta, ale to oznacza, że ​​mój klient musi mieć DirectX 11.1 lub wyższy dostępny, co jest niemożliwe, jeśli chciałbym przesłać strumieniowo na platformę mobilną .

Odpowiedz

4

Można użyć interfejsu IMFTransform dla kodowania H264. Po uzyskaniu IMFallample z ID3D11Texture2D wystarczy przekazać go do IMFTransform :: ProcessInput i uzyskać kodowany IMFSample z IMFTransform :: ProcessOutput.

Refer to this Przykład kodowania szczegółów.

Po uzyskaniu zakodowanych IMFSamples można je przesyłać pojedynczo przez sieć.

+0

Twój link jest martwy –

+1

Znaleziono link [tutaj] (https://github.com/ashumeow/webrtc4all/blob/master/gotham/MFT_WebRTC4All/test/test.cc) –