2017-02-03 4 views
2

Ich entwickle USB-Kamera Streaming-Desktop-Anwendung mit MediaFoundation SourceReader-Technik. Die Kamera verfügt über USB3.0-Unterstützung und bietet 60 fps für 1080p MJPG-Videoformat-Auflösung.Verwendung von Intel Hardware MJPEG Decoder MFT in MediaFoundation SourceReader für Windows Desktop-Anwendung?

Ich habe Software MJPEG Decoder MFT verwendet, um MJPG in YUY2-Frames zu konvertieren und dann in den RGB32-Frame konvertiert, um auf das Fenster zu zeichnen. Anstelle von 60 fps kann ich mit diesem Software-Decoder nur 30 fps im Fenster rendern. Ich habe eine Frage auf dieser Seite gestellt und einen Vorschlag bekommen, Intel Hardware MJPEG Decoder MFT zu benutzen, um Rahmentropfenprobleme zu lösen.

Ich habe einen Fehler 0xC00D36B5 konfrontiert - MF_E_NOTACCEPTING wenn IMFTransform Aufruf :: Process() Methode. Um diesen Fehler zu beheben, schlug MSDN vor, die IMFTranform-Schnittstelle asynchron zu verwenden. Also habe ich IMFMediaEventGenerator Schnittstelle zu GetEvent für jedes In/Out-Beispiel verwendet. Erfolgreich, ich kann nur ein Eingabe Beispiel verarbeiten und dann kontinuierlich IMFMediaEventGenerator :: GetEvent() -Methoden gibt MF_E_NO_EVENTS_AVAILABLE Fehler (GetEvent() ist synchron).

Ich habe versucht, einen asynchronen Rückruf für SourceReader sowie IMFTransform zu konfigurieren aber MFAsyncCallback :: Invoke Methode aufruft, nicht, daher GetEvent Methode zu verwenden, die ich geplant.

Fehle ich irgendetwas? Wenn ja, jemand leitet mich, Intel Hardware Decoder in meinem Projekt zu verwenden?

+0

Haben Sie versucht, zuerst eine Topologie in Topoedit zu erstellen? – Mgetz

+0

Vielen Dank für Ihre Antwort, Mgetz. Die Kamera unterstützt sowohl YUY2 und MJPG Videoformat. Zunächst spielt die Kamera das YUY2-Videoformat und muss das MJPG-Format ändern. Ich weiß, wie man das Diagramm in DirectShow erstellt. Ich wusste nicht, wie ich vom YUY2- zum MJPEG-Videoformat wechseln konnte. Kannst du mir sagen, wie man eine Topologie für das MJPG-Format zusammenstellt? Außerdem habe ich diesen Decoder in MediaSession Topologie hinzugefügt, alles hat Erfolg und erhielt 0XC00D5212 (MF_E_TOPO_CODEC_NOT_FOUND) in dem Ereignis. – Abi

+0

Daher die Empfehlung, das topoedit-Dienstprogramm zu verwenden, das mit dem SDK geliefert wird, um eine Topologie zu erstellen und zu testen, ob es funktioniert. Wenn Sie in Topoedit keine Topologie aufbauen können, ist das wahrscheinlich nicht möglich. – Mgetz

Antwort

1

Intel Hardware MJPEG Decoder MFT ist ein asynchronous MFT und wenn Sie es direkt verwalten, sind Sie verantwortlich, asynchrones Modell anzuwenden. Sie scheinen dies zu tun, aber Sie liefern keine Informationen, die es ermöglichen, das Problem zu beheben. Ja, Sie müssen das in den Abschnitten ProcessInput, ProcessOutput beschriebene Ereignismodell verwenden. Wenn Sie den ersten Frame erhalten, sollten Sie weiter debuggen, damit er reibungslos fortlaufend verarbeitet werden kann.

Wenn Sie APIs wie media session unseren Quellenleser verwenden, haben Sie Media Foundation selbst mit den MFTs zu tun. Es ist in der Lage, bei Bedarf synchronen und asynchronen Verbrauch durchzuführen. In diesem Fall tun Sie jedoch nicht IMFTransform Anrufe und sogar von Ihrer vagen Beschreibung kommt es, dass Sie es falsch machen.

+0

Vielen Dank für die Korrektur meines Fehlers, Roman. Ich habe einen asynchronen Rückruf registriert und versucht, asynchrone Ereignisse zu erhalten, aber ich habe keine Ereignisse von IMFAsyncCallback :: Invoke() erhalten. Können Sie mir bitte sagen, wie Sie den asynchronen Callback für SourceReader registrieren und auf Hardware MFT zugreifen? – Abi

+0

Ich habe den IMFAsyncCallback-Rückruf erfolgreich für MFT registriert.Ich habe das MFTransformNeedInput-Ereignis empfangen, um das Eingabe-Beispiel zweimal zu verarbeiten, aber das MFTransformHaveOutput-Ereignis wird überhaupt nicht aufgerufen. Ich habe Code angehängt, den ich in meinem Projekt verwende. PFA der Dropbox-Link, um meinen Code zu überprüfen: https://www.dropbox.com/s/t6figfl9b2kyp6y/HwMJPEGDecoderMFT_Code_Query.txt?dl=0. Ich habe die ProcessOutputSample() - Methode in meinem Code kommentiert und kontinuierlich den MFTransformNeedInput-Ereignistyp kontinuierlich empfangen. Könnten Sie mir bitte sagen, was falsch läuft und warum ich ProcessOutputSample nicht erhalten habe? – Abi

+0

@Abika: Es ist nur ein Code-Snippet, ich mag ein paar Momente nicht, aber wichtiger ist, dass es nicht ausführbar ist und ich bin mir nicht sicher, was das ursprüngliche Problem verursacht, mit dem Sie Probleme haben. Ich mag definitiv nicht die Art, wie Sie 'WaitForSingleObject' sequentiell von einem Code-Fragment, das von einem kritischen Abschnitt geschützt wird, machen. –

Verwandte Themen