Auswählen eines Decoders in DirectShow Editing Services
[Das dieser Seite zugeordnete Feature DirectShow ist ein Legacyfeature. Es wurde von MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation abgelöst. Diese Features wurden für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt dringend, dass neuer Code mediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation anstelle von DirectShow verwendet, wenn möglich. Microsoft schlägt vor, dass vorhandener Code, der die Legacy-APIs verwendet, so umgeschrieben wird, dass nach Möglichkeit die neuen APIs verwendet werden.]
[Diese API wird nicht unterstützt und kann in Zukunft geändert oder nicht mehr verfügbar sein.]
Wenn DirectShow Editing Services (DES) ein Videobearbeitungsprojekt rendert, wählt die Rendering-Engine automatisch die erforderlichen Decoder aus. Dies kann innerhalb der IRenderEngine::ConnectFrontEnd-Methode oder dynamisch während des Renderings geschehen.
Ein Benutzer kann mehrere Decoder installieren, die eine bestimmte Datei decodieren können. Wenn mehrere Decoder verfügbar sind, verwendet DES den Intelligent Connect-Algorithmus , um den Decoder auszuwählen.
Es gibt keine Möglichkeit für die Anwendung, direkt anzugeben, welcher Decoder verwendet werden soll. Sie können den Decoder jedoch indirekt über die IAMGraphBuilderCallback-Rückrufschnittstelle auswählen. Wenn Sie diese Schnittstelle in Ihrer Anwendung implementieren, können Sie während des Diagrammerstellungsprozesses Benachrichtigungen erhalten und bestimmte Filter aus dem Diagramm ablehnen.
Implementieren Sie zunächst eine Klasse, die die IAMGraphBuilderCallback-Schnittstelle verfügbar macht:
class GraphBuilderCB : public IAMGraphBuilderCallback
{
public:
// Method declarations (not shown).
};
Erstellen Sie dann eine instance des Filter Graph-Managers, und registrieren Sie Ihre Klasse, um Rückrufbenachrichtigungen zu erhalten:
// Declare an instance of the callback object.
GraphBuilderCB GraphCB;
// Create the Filter Graph Manager.
CComPtr<IGraphBuilder> pGraph;
hr = pGraph.CoCreateInstance(CLSID_FilterGraph);
if (FAILED(hr))
{
// Handle error (not shown).
}
// Register to receive the callbacks.
CComQIPtr<IObjectWithSite> pSite(pGraph);
if (pSite)
{
hr = pSite->SetSite((IUnknown*)&GraphCB);
}
Erstellen Sie als Nächstes die Render-Engine, und rufen Sie die IRenderEngine::SetFilterGraph-Methode mit einem Zeiger auf den Filtergraph-Manager auf. Dadurch wird sichergestellt, dass die Render-Engine keinen eigenen Filtergraph-Manager erstellt, sondern stattdessen die instance verwendet, die Sie für Rückrufe konfiguriert haben.
CComPtr<IRenderEngine> pRender;
hr = pRender.CoCreateInstance(CLSID_RenderEngine);
if (FAILED(hr))
{
// Handle error (not shown).
}
hr = pRender->SetFilterGraph(pGraph);
Wenn das Projekt gerendert wird, wird die IAMGraphBuilderCallback::SelectedFilter-Methode der Anwendung aufgerufen, unmittelbar bevor der Filter graph-Manager einen neuen Filter erstellt. Die SelectedFilter-Methode empfängt einen Zeiger auf eine IMoniker-Schnittstelle , die einen Moniker für den Filter darstellt. Untersuchen Sie den Moniker, und wenn Sie sich entscheiden, den Filter abzulehnen, geben Sie einen Fehlercode aus der SelectedFilter-Methode zurück.
Der schwierige Teil besteht darin, zu ermitteln, welche Moniker Decoder darstellen – und insbesondere, welche Moniker Decoder darstellen, die Sie ablehnen möchten. Eine Lösung ist die folgende:
Verwenden Sie vor dem Rendern des Projekts die IFilterMapper2::EnumMatchingFilters-Methode , um eine Liste von Filtern zu erstellen, die als akzeptiert den gewünschten Eingabetyp registriert sind. Bei Video- oder Audiokomprimierungstypen sollte diese Liste einem Satz von Decodern zugeordnet werden.
Die EnumMatchingFilters-Methode gibt eine Auflistung von Monikern zurück. Rufen Sie für jeden Moniker in der Auflistung die DisplayName-Eigenschaft ab, wie unter Verwenden der Filterzuordnung beschrieben.
Speichern Sie eine Liste der Anzeigenamen, aber lassen Sie den Anzeigenamen aus, der dem Filter entspricht, den Sie für die Decodierung verwenden möchten. Anzeigenamen für Softwarefilter haben die folgende Form:
OLESTR("@device:sw:{CategoryGUID}\{FilterCLSID}");
where
CategoryGUID
ist die GUID der Filterkategorie, und
FilterCLSID
ist die CLSID des Filters. Für DMOs ist das Format identisch, ändern Sie
sw
jedoch indmo
.Die Liste enthält nun Anzeigenamen für jeden Filter, der den gewünschten Medientyp ausgibt, aber nicht Ihr bevorzugter Filter ist.
Rufen Sie in der SelectedFilter-Methode die DisplayName-Eigenschaft für den vorgeschlagenen Moniker ab, und überprüfen Sie sie anhand der gespeicherten Liste. Wenn der Anzeigename mit einem Eintrag in der Liste übereinstimmt, lehnen Sie diesen Filter ab. Andernfalls akzeptieren Sie sie, indem Sie S_OK zurückgeben.
Zugehörige Themen