Partilhar via


Compartilhando dados entre fluxos

[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.]

Observação

Essas APIs foram preteridas. Os aplicativos devem usar o filtro Captura de Exemplo ou implementar um filtro personalizado para obter dados de um grafo de filtro directShow.

 

O processamento de dados multimídia normalmente requer uma grande quantidade de recursos do sistema; portanto, você deve evitar copiar dados sempre que possível. A arquitetura de streaming dá suporte a exemplos de fluxo compartilhado, um mecanismo que move dados de um fluxo para outro sem copiá-los. Esse buffer permite o transporte eficiente de dados entre dois fluxos, mesmo que o fluxo de destino não dê suporte especificamente ao formato de dados subjacente.

Por exemplo, suponha que você tenha um fluxo multimídia com três fluxos de dados: vídeo e áudio e dados de URL carimbados para corresponder ao conteúdo do vídeo. Você deseja escrever um aplicativo que adicione um aviso de direitos autorais em cada quadro de vídeo e grave os dados em outro fluxo para armazenamento, mas seu aplicativo não entende nenhum formato de dados, exceto o fluxo de vídeo. Para o fluxo de vídeo, você cria um exemplo anexado à superfície de DirectDraw desejada. Em seguida, você pode criar um fluxo de saída chamando o método IDirectDrawMediaStream::CreateSample com esse ponteiro para a mesma superfície ou IMediaStream::CreateSharedSample. Em ambos os casos, os fluxos de entrada e saída compartilham a superfície DirectDraw. Como você entende o formato de vídeo, pode acessar essa superfície conforme necessário.

Para recuperar os outros ponteiros de fluxo de origem (áudio e URL), enumere o fluxo de contêiner de origem e pegue ponteiros para os fluxos não video. Cada um desses fluxos de origem tem um fluxo de saída associado no contêiner de fluxo de saída. Recupere esses ponteiros de saída chamando o método IMultiMediaStream::GetMediaStream no contêiner de saída com cada um dos ponteiros de fluxo de origem. As etapas a seguir descrevem esse processo.

  1. Chame IMultiMediaStream::EnumMediaStreams para recuperar um ponteiro para um fluxo de origem. Verifique se ele não é o fluxo de vídeo, pois seu aplicativo já entende seu formato.
  2. Chame IMultiMediaStream::GetMediaStream no fluxo de contêiner de saída com o ponteiro da etapa 1. Isso retorna um ponteiro para o fluxo de saída desejado.
  3. Chame AllocateSample no fluxo de origem.
  4. Chame CreateSharedSample no fluxo de saída.
  5. Chame Update no fluxo de origem para ler os dados.
  6. Chame Update no fluxo de saída para gravar os dados.

Repita estas etapas para cada fluxo cujo formato você não dá suporte. Quando ambos os exemplos terminarem de atualizar, o fluxo de saída terá todos os dados do fluxo de origem e você terminará.