2016-07-12 23 views
0

Ich arbeite an einer Anwendung, die die Analyse von Videodateien macht. Da ich kein Experte für DirectShow bin, habe ich einfachen Code für die Analyse aller Frames (SampleGrabber, Callback etc.) verwendet. Dies funktioniert für alle Mediendateien, auch wenn mit VideoInfoHeader2 Struktur dekodiert (obwohl es nicht, wie überall angegeben). Das Problem ist mit einem einzigen Rahmen greifen. Dafür habe ich IMediaDet verwendet. Und das geht nicht, wenn es nur VideoInfoHeader2, und keinen VideoInfoHeader gibt. Ich habe versucht, Änderungen an meinem Analysecode (OneShot, Seek) vorzunehmen, aber das geht nicht. Alle Quellen im Internet zu diesem Thema sind nicht sehr hilfreich, wie sie auf SDK/DX Beispiele zeigen, die nicht mehr zugänglich sind, oder sie sagen nur, dass die Änderung "einfach" wäre. Nun, vielleicht für einen DX-Experten ... (Aber ich muss das Auto verwenden, nicht zuerst, um es zu bauen ... ;-) Als die Angelegenheit wurde mehr mein "Workaround" ist zu recode alle Videos mit VideoInfoHeader2, speichern Sie sie mit VideoInfoHeader, und machen Sie die Analyse/Grabbing auf. Sehr ressourcenintensiv, und das Gegenteil von smart ... Jede Hilfe geschätzt.Greife Frames wenn VideoInfoHeader2 Struktur

Antwort

1

Sie haben die notwendigen Schritte beschrieben, die immer noch die einfachste Lösung sind (vorausgesetzt, Sie geben nicht auf und verwenden die Windows-API; die Verwendung einer Drittanbieterbibliothek könnte im Vergleich einfacher sein, aber dies würde den Rahmen dieser Frage sprengen).

Sample Grabber und IMediaDet sind Teile von veralteten DirectShow Editing Services, deren Entwicklung vor langer Zeit gestoppt wurde. Wenn Sie mit der Lager-API nicht zufrieden sind, müssen Sie einen flexibleren Ersatz verwenden. Sie können beispielsweise die Quelle eines ähnlichen Sample Grabber-Beispiels aus einem älteren DirectX- oder Platform SDK abrufen und es so erweitern, dass es VIDEOINFOHEADER2 unterstützt.

IMediaDet ist nichts anderes als COM-Klasse, die einen eigenen Graph intern versucht, Video zu dekodieren. Es ist unflexibel und fast jedes Mal, wenn Sie Ihr eigenes Diagramm erstellen, ist eine zuverlässigere Lösung.

Microsofts Antwort auf dieses Problem ist - wie sie die DirectShow-Entwicklung aufgegeben haben - die neuere API Media Foundation. Es gibt jedoch Gründe, warum diese "Antwort" nicht so gut ist: begrenzte Betriebssystemkompatibilität, eingeschränkte Unterstützung für Codecs und Formate, komplett neue API, die wenig mit DirectShow gemein hat und Sie müssen Ihre Anwendung neu gestalten.

Alles in allem müssen Sie entweder einen Sample Grabber-Ersatz mit einer der beliebten und erklärten Methoden finden (egal, dass sie nicht so hilfreich aussehen), oder zu einer anderen API oder einer anderen Bibliothek wechseln. Oder eine andere mögliche Lösung besteht darin, einen anderen Filter/Codec zu verwenden, der in den formatierten Medientyp VIDEOINFOHEADER decodieren kann.

+0

Vielen Dank für Ihre Antwort. Grabbing Rahmen aus dem neuen VIDEOINFOHEADER2 wird eine sehr häufige Aufgabe sein, die ich denken sollte. Wenn die Situation wie beschrieben ist, kann ich nicht verstehen, warum es nicht einfach ist, Quellcode irgendwo zu verwenden, da es sehr entmutigend ist, alte (und schwer zu findende) Samples zu bearbeiten, um direktes Wissen über DirectShow zu erhalten es für VIDEOINFOHEADER2. – nji9