Compartilhar via


Fornecendo um resizer de vídeo personalizado

[O recurso associado a esta página, DirectShow, é um recurso herdado. Foi substituído por MediaPlayer, IMFMediaEngine e Audio/Video Capture in 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 Audio/Video Capture in 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.]

[Não há suporte para essa API e pode ser alterada ou indisponível no futuro.]

Observação

Esse recurso requer o DirectX 9.0 ou posterior.

 

Quando o DirectShow Editing Services (DES) redimensiona um clipe de origem de vídeo, o comportamento padrão é um StretchBlt, que é rápido, mas não anti-alias. Você pode alterar o comportamento de redimensionamento implementando um resizer personalizado como um filtro de transformação do DirectShow. O filtro deve expor a interface IResize , que permite que o DES especifique o tamanho do vídeo de entrada e saída. Para obter informações sobre como escrever um filtro de transformação, consulte Escrevendo filtros de transformação. A classe base CTransformFilter é recomendada como o ponto de partida. Ao implementar o filtro, observe o seguinte:

  • Dê suporte à interface IResize no filtro (não aos pinos).
  • O filtro deve aceitar apenas formatos VIDEOINFOHEADER (FORMAT_VideoInfo). Rejeitar outros tipos de formato.
  • O formato de vídeo do DES pode ser qualquer tipo RGB descompactado, incluindo RGB de 32 bits com alfa (MEDIASUBTYPE_ARGB32). Seu filtro pode rejeitar formatos com segurança com o biHeight< 0.
  • Antes que o Mecanismo de Renderização conecte o pino de saída do filtro, ele chama IResize::p ut_MediaType para definir o tipo de saída. Ele também pode chamar IResize::p ut_Size para ajustar o tamanho da saída. Ele pode chamar esses dois métodos em qualquer ordem, qualquer número de vezes, antes de conectar o pino de saída.
  • Depois que o Mecanismo de Renderização conectar o pino de saída, ele poderá chamar put_Size novamente. O filtro do resizer deve reconectar seu pino de saída com o novo tamanho.
  • Dentro do método CTransformFilter::Transform do filtro, estique o vídeo de entrada até o tamanho da saída.
  • O filtro nunca deve definir o sinalizador de descontinuidade no exemplo de saída ou anexar um tipo de mídia ao exemplo de saída.
  • Para salvar o estado do filtro em um arquivo GraphEdit (.grf), implemente a interface IPersistStream . (Isso é opcional, mas útil para teste.)

Para usar o filtro de resizer, o filtro deve ser registrado como um objeto COM no sistema do usuário. Antes que o aplicativo renderize o projeto de vídeo, consulte o Mecanismo de Renderização para a interface IRenderEngine2 e chame IRenderEngine2::SetResizerGUID com o CLSID do filtro do resizer.

Renderizando um projeto