Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
[Funktionen som är associerad med den här sidan, DirectShow, är en äldre funktion. Det har ersatts av MediaPlayer, IMFMediaEngineoch Audio / Video Capture i Media Foundation. Dessa funktioner har optimerats för Windows 10 och Windows 11. Microsoft rekommenderar starkt att ny kod använder MediaPlayer, IMFMediaEngine och Audio/Video Capture i Media Foundation i stället för DirectShow, när det är möjligt. Microsoft föreslår att befintlig kod som använder äldre API:er skrivs om för att använda de nya API:erna om möjligt.]
[Det här API:et stöds inte och kan ändras eller vara otillgängligt i framtiden.]
När DirectShow Editing Services (DES) återger ett videoredigeringsprojekt väljer renderingsmotorn automatiskt de nödvändiga avkodarna. Detta kan inträffa i metoden IRenderEngine::ConnectFrontEnd eller dynamiskt under återgivningen.
En användare kan installera flera avkodare som kan avkoda en viss fil. När flera avkodare är tillgängliga använder DES algoritmen Intelligent Connect för att välja avkodaren.
Det finns inget sätt för programmet att ange direkt vilken avkodare som ska användas. Du kan dock välja avkodaren indirekt via IAMGraphBuilderCallback återropsgränssnitt. Genom att implementera det här gränssnittet i ditt program kan du ta emot meddelanden under grafskapandeprocessen och avvisa vissa filter från diagrammet.
Börja med att implementera en klass som exponerar gränssnittet IAMGraphBuilderCallback:
class GraphBuilderCB : public IAMGraphBuilderCallback
{
public:
// Method declarations (not shown).
};
Skapa sedan en instans av Filter Graph Manager och registrera din klass för att ta emot återanropsmeddelanden:
// 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);
}
Skapa sedan återgivningsmotorn och anropa metoden IRenderEngine::SetFilterGraph med en pekare till Filter Graph Manager. Detta säkerställer att renderningsmotorn inte skapar sin egen Filter Graph Manager, utan i stället använder den instans som du har konfigurerat för återanrop.
CComPtr<IRenderEngine> pRender;
hr = pRender.CoCreateInstance(CLSID_RenderEngine);
if (FAILED(hr))
{
// Handle error (not shown).
}
hr = pRender->SetFilterGraph(pGraph);
När projektet återges anropas programmets IAMGraphBuilderCallback::SelectedFilter-metoden omedelbart innan Filter Graph Manager skapar ett nytt filter. Metoden SelectedFilter tar emot en pekare till ett IMoniker- gränssnitt som representerar en moniker för filtret. Granska monikern och om du väljer att avvisa filtret returnerar du en felkod från metoden SelectedFilter.
Det svåra är att identifiera vilka monikers som representerar avkodare – och i synnerhet vilka monikers som representerar dekodare som du vill avvisa. En lösning är följande:
Innan du återger projektet använder du metoden IFilterMapper2::EnumMatchingFilters för att skapa en lista med filter som är registrerade som att acceptera önskad indatatyp. För typer av video- eller ljudkomprimering bör den här listan mappas till en uppsättning avkodare.
Metoden EnumMatchingFilters returnerar en samling monikers. För varje moniker i samlingen hämtar du egenskapen DisplayName enligt beskrivningen i Using the Filter Mapper.
Lagra en lista över visningsnamnen, men utelämna visningsnamnet som matchar det filter som du vill använda för avkodning. Visningsnamn för programvarufilter har följande formulär:
OLESTR("@device:sw:{CategoryGUID}\{FilterCLSID}");var
CategoryGUIDär GUID:en för filterkategorin och
FilterCLSIDär filtrets CLSID. För DMOs är formatet detsamma, men ändra
swtilldmo.Listan innehåller nu visningsnamn för varje filter som matar ut önskad medietyp men som inte är önskat filter.
I metoden SelectedFilter hämtar du egenskapen DisplayName på den föreslagna monikern och kontrollerar den mot den lagrade listan. Om visningsnamnet matchar en post i listan avvisar du filtret. Annars kan du acceptera det genom att returnera S_OK.
Relaterade ämnen