Gravando um arquivo de mídia do Windows no DES
[O recurso associado a esta página, DirectShow, é um recurso herdado. Ele foi substituído por MediaPlayer, IMFMediaEngine e Captura de Áudio/Vídeo na Media Foundation. Esses recursos foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda fortemente que o novo código use MediaPlayer, IMFMediaEngine e Captura de Áudio/Vídeo no Media Foundation em vez de DirectShow, quando possível. A Microsoft sugere que o código existente que usa as APIs herdadas seja reescrito para usar as novas APIs, se possível.]
[Essa API não tem suporte e pode ser alterada ou indisponível no futuro.]
Esta seção descreve como escrever um arquivo de Mídia do Windows usando o DES (Serviços de Edição do DirectShow ).
Importante
Não use o Mecanismo de Renderização Inteligente para gravar arquivos do Windows Media. Sempre use o Mecanismo de Renderização Básica (CLSID_RenderEngine).
Para gravar um arquivo do Windows Media, faça o seguinte:
Chame SetSite no mecanismo de renderização, com um ponteiro para o provedor de chaves.
Crie o front-end do grafo. (Consulte Renderizando um projeto.)
Crie o filtro Gravador ASF do WM e adicione-o ao grafo.
Use a interface IFileSinkFilter no filtro Gravador do ASF do WM para definir o nome do arquivo.
Configure o Gravador ASF do WM para usar um perfil do Windows Media. Cada perfil tem um número predefinido de fluxos. Você deve escolher um perfil que corresponda aos grupos em seu projeto.
A interface IConfigAsfWriter contém alguns métodos diferentes para definir o perfil. Por exemplo, o método ConfigureFilterUsingProfileGuid especifica um perfil do sistema como GUID. Ou você pode usar métodos de Formato de Mídia do Windows para obter um ponteiro IWMProfile e, em seguida, chamar IConfigAsfWriter::ConfigureFilterUsingProfile. Para obter mais informações, consulte Configurando o gravador ASF.
Conecte o front-end ao Gravador DO ASF. O front-end do grafo contém um pino de saída para cada grupo. Supondo que você especificou um perfil compatível, o Gravador ASF deve ter um conjunto correspondente de pinos de entrada. Conecte cada pino de saída ao pino de entrada correspondente. A maneira mais fácil de fazer isso é usando o método ICaptureGraphBuilder2::RenderStream . Primeiro, crie uma nova instância do Construtor de Grafo de Captura e inicialize-a com um ponteiro para o Gerenciador de Grafo de Filtro:
ICaptureGraphBuilder2 *pBuild = 0; hr = CoCreateInstance(CLSID_CaptureGraphBuilder2, 0, CLSCTX_INPROC_SERVER, IID_ICaptureGraphBuilder2, (void**)&pBuild); pBuild->SetFiltergraph(pGraph);
Em seguida, recupere o pino de saída para cada grupo chamando o método IRenderEngine::GetGroupOutputPin . Chame RenderStream para conectar o pino ao Gravador ASF:
long cGroups = 0; hr = pTimeline->GetGroupCount(&cGroups); for (long i = 0; i < cGroups; i++) { IPin *pPin; hr = pRenderEngine->GetGroupOutputPin(i, &pPin); if (SUCCEEDED(hr)) { hr = pBuild->RenderStream(0, 0, pPin, 0, pASF); } pPin->Release(); } pBuild->Release
Tópicos relacionados