Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
[O recurso associado a esta página, DirectShow, é um recurso herdado. Foi substituído por MediaPlayer, IMFMediaEnginee Audio/Video Capture in Media Foundation. Esses recursos foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda vivamente que o novo código utilize 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.]
Um tipo de mídia descreve o formato associado a um fluxo de dados de mídia. Este artigo descreve como os DMOs lidam com tipos de mídia. Destina-se principalmente a desenvolvedores que estão escrevendo seus próprios DMOs personalizados.
Os tipos de mídia são definidos usando a estrutura DMO_MEDIA_TYPE. Esta estrutura inclui as seguintes informações:
- O tipo principal é um identificador global exclusivo (GUID) que define uma categoria ampla, como áudio ou vídeo.
- O subtipo é um GUID que define aspetos mais específicos do tipo. Por exemplo, dentro do vídeo, os subtipos incluem RGB de 16 bits, RGB de 24 bits, UYVY, vídeo codificado em DV e assim por diante.
- O de bloco de formato é uma estrutura secundária que especifica completamente o formato. O layout do bloco de formato depende do tipo de dados. Por exemplo, o áudio PCM usa a estrutura WAVEFORMATEX. O vídeo usa várias outras estruturas, incluindo VIDEOINFOHEADER e VIDEOINFOHEADER2. O layout do bloco de formato é identificado por um GUID de tipo de formato. Por exemplo, FORMAT_WaveFormatEx especifica uma estrutura de WAVEFORMATEX.
Quando um DMO é criado pela primeira vez, os fluxos não têm um tipo de mídia. Antes que o DMO possa processar quaisquer dados, o cliente deve definir um tipo de mídia para cada fluxo. Esse processo é descrito da perspetiva do cliente em Setting Media Types on a DMO.
tipos de mídia no do Registro
Um DMO pode adicionar uma lista de tipos de mídia que ele suporta para o registro, chamando o DMORegister função. Um aplicativo pode usar essas informações para procurar DMOs que correspondam a um formato específico. As informações constantes do registo não se destinam a ser exaustivas. Normalmente, você incluiria apenas os tipos principais suportados pelo DMO. A entrada do Registro tem chaves separadas para tipos de entrada e saída, mas não distingue entre fluxos individuais.
A função DMORegister usa a estrutura DMO_PARTIAL_MEDIATYPE para descrever tipos de mídia. Essa estrutura contém um subconjunto das informações encontradas na estrutura DMO_MEDIA_TYPE, ou seja, o tipo principal e o subtipo. Ele não inclui um bloco de formato, porque o bloco de formato normalmente contém informações que são muito granulares para incluir no registro, como a altura e a largura de uma imagem de vídeo.
tipos de mídia preferidos
Depois que o aplicativo cria um DMO, ele pode consultar o DMO para os tipos de mídia que ele suporta. Para cada fluxo, o DMO cria uma lista de tipos de mídia (possivelmente vazios), classificados em ordem de preferência. Os IMediaObject::GetInputType e IMediaObject::GetOutputType métodos enumeram os tipos preferenciais. Os tipos preferidos de um fluxo podem mudar dinamicamente quando o aplicativo define tipos de mídia em outros fluxos. Por exemplo, a lista de tipos de saída preferidos pode mudar depois que o tipo de entrada é definido, ou vice-versa. No entanto, o DMO não é obrigado a atualizar seus tipos preferidos dinamicamente. O aplicativo não pode assumir que todos os tipos que recebe são válidos. Por esse motivo, os métodos IMediaObject::SetInputType e IMediaObject::SetOutputType oferecem suporte a um sinalizador para testar um tipo específico.
O GetInputType e GetOutputType métodos retornam uma estrutura DMO_MEDIA_TYPE. O DMO pode deixar algumas das informações nesta estrutura em branco, para indicar uma gama de tipos. O tipo ou subtipo principal pode ser GUID_NULL e o bloco de formato pode estar vazio (zero bytes). Se o bloco de formato estiver vazio, o tipo de formato deverá ser GUID_NULL.
Depois que o aplicativo define todos os tipos de entrada de um DMO, o DMO geralmente deve retornar pelo menos um tipo completo para cada fluxo de saída. Um tipo de saída completo facilita o teste, e os aplicativos podem usá-lo como um padrão razoável. O aplicativo de teste DMO depende desse comportamento. (Consulte Usando o aplicativo DMOTest.)
Definindo os tipos de mídia
Os aplicativos usam os métodos SetInputType e SetOutputType para testar, definir ou limpar tipos em um fluxo especificado. O pedido deve especificar completamente o tipo. O DMO verifica se pode aceitar o tipo proposto. A resposta pode depender de quais tipos foram definidos em outros fluxos. O sinalizador DMO_SET_TYPEF_CLEAR limpa o tipo de um fluxo, para que o aplicativo possa "recuar" e tentar outra combinação.
Cenários de exemplo
Os exemplos a seguir descrevem alguns cenários típicos, para ilustrar os pontos apresentados nas seções anteriores.
- Descodificadores de vídeo. Em um decodificador de vídeo típico, o tipo de entrada determina parcialmente o tipo de saída. Por exemplo, geralmente ambos os fluxos devem ter a mesma taxa de quadros e dimensões de imagem. Uma opção é não definir nenhum tipo de saída preferencial até que o tipo de entrada seja definido. Outra opção é enumerar um conjunto de tipos incompletos, omitindo o bloco de formato. Use o subtipo para indicar os tipos não compactados suportados, como RGB de 16 bits, RGB de 24 bits e assim por diante. Além disso, os decodificadores de vídeo geralmente não suportam a configuração do tipo de saída antes do tipo de entrada. O cenário habitual é decodificar a partir de um formato de entrada conhecido, portanto, essa limitação é razoável.
- Descodificadores de áudio. Um descodificador de áudio pode suportar um conjunto limitado e fixo de formatos de saída. Nesse caso, ele pode ser capaz de criar uma lista de formatos de saída preferidos antes que o formato de entrada seja conhecido.
- Compressores. Na maioria dos casos, um compressor de vídeo não pode especificar totalmente seus formatos de saída preferidos até que o aplicativo defina o formato de entrada e vice-versa. Em vez disso, o DMO deve retornar um tipo incompleto sem bloco de formato. Para compressão de áudio e vídeo, o aplicativo geralmente precisa definir vários parâmetros de saída, como a taxa de bits. No entanto, depois que o tipo de entrada é definido, o compressor deve retornar pelo menos um tipo de saída completa, pelas razões mencionadas anteriormente.
Tópicos relacionados
-
Escrevendo um DMO