Adicionando objetos de efeito e transição

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

No DES, um efeito ou transição é representado com dois objetos:

  • Um objeto linha do tempo representa o efeito ou a transição dentro do linha do tempo. Para efeitos, o objeto linha do tempo dá suporte à interface IAMTimelineEffect. Para transições, ele dá suporte à interface IAMTimelineTrans . Ambos os tipos dão suporte à interface IAMTimelineObj .
  • O subobjeto é um objeto que implementa o processamento de dados para o efeito ou transição. O objeto linha do tempo contém um ponteiro para o subobjeto.

Para adicionar um efeito ou transição, execute as etapas a seguir.

1. Criar o objeto Timeline

Para criar o objeto linha do tempo, chame o método IAMTimeline::CreateEmptyNode. Defina o tipo igual a TIMELINE_MAJOR_TYPE_EFFECT para um efeito ou TIMELINE_MAJOR_TYPE_TRANSITION para uma transição.

O exemplo a seguir cria um objeto de transição:

IAMTimelineObj *pTransObj = NULL;
pTimeline->CreateEmptyNode(&pTransObj, TIMELINE_MAJOR_TYPE_TRANSITION);

2. Especifique o subobjeto

O objeto linha do tempo atua como um wrapper para outro objeto, chamado de subobjeto, que faz o trabalho real. O subobjeto implementa uma transformação de dados que produz o efeito desejado ou a transição. Para obter uma lista de transições e efeitos fornecidos com o DES, consulte Transições e efeitos.

Para definir o subobject, chame o método IAMTimelineObj::SetSubObjectGUID no objeto linha do tempo, passando-o o CLSID (identificador de classe) do subobject. O DirectShow fornece um enumerador para efeitos de vídeo e transições de vídeo, que você pode usar para obter o CLSID. Para obter mais informações, consulte Enumerando efeitos e transições.

O exemplo a seguir define a Transição de Apagamento SMPTE como o subobjeto :

hr = pTransObj->SetSubObjectGUID(CLSID_DxtJpeg);  // SMPTE Wipe

3. Definir os horários de início e parada

Para definir os horários de início e parada, chame o método IAMTimelineObj::SetStartStop . Esses horários são relativos à hora de início do objeto pai. Os efeitos podem se sobrepor no mesmo objeto, mas as transições não podem.

O exemplo a seguir define a hora de início como 5 segundos e o tempo de parada como 10 segundos:

const REFERENCE_TIME ONE_SECOND = 10000000
hr = pTransObj->SetStartStop(5 * ONE_SECOND, 10 * ONE_SECOND);

Quando uma transição é renderizada, o progresso da transição em cada quadro é calculado com base em uma propriedade Progress , que é normalizada para um intervalo de 0,0 a 1,0. O DES usa a hora de início de cada quadro para calcular o valor de progresso. Isso significa que se o tempo de parada de transição for igual ao tempo de parada de origem, o valor Progress nunca atingirá exatamente 1,0, pois a hora de início do último quadro é ligeiramente superior à hora de parada. Para fazer a transição chegar a 1.0, defina o tempo de parada de transição como pelo menos um quadro anterior ao tempo de parada de origem.

4. Inserir o objeto na linha do tempo

Para inserir o objeto no linha do tempo, chame um dos seguintes métodos no pai, dependendo do tipo de objeto:

No método IAMTimelineEffectable::EffectInsBefore , você deve especificar a prioridade do efeito. Quando os efeitos se sobrepõem no mesmo objeto, eles são aplicados em ordem de prioridade. O efeito de áudio do Envelope de Volume é uma exceção; consulte a referência efeito envelope de volume para obter detalhes. Em uma composição, todas as faixas de áudio são misturadas antes que os efeitos de áudio dessa composição sejam aplicados.

Como as transições não podem se sobrepor ao mesmo objeto, elas não têm um valor de prioridade.

O exemplo a seguir adiciona o objeto de transição a uma faixa:

IAMTimelineTransable *pTransable = NULL;
hr = pTrack->QueryInterface(IID_IAMTimelineTransable, (void **)&pTransable);
hr = pTransable->TransAdd(pTransObj);  
pTransable->Release();

O exemplo consulta o objeto track para a interface IAMTimelineTransable antes de chamar AddTrans.

5. Definir Propriedades

Muitos efeitos e transições dão suporte a propriedades personalizadas. Para obter informações, consulte Configurando propriedades em efeitos e transições.

Exemplo

O exemplo de código a seguir adiciona uma Transição de Apagamento SMPTE a uma faixa. Ele pressupõe que o objeto track já existe no linha do tempo.

IAMTimeline *pTL;
IAMTimelineTrack *pTrack;

// Create timeline with track (not shown).

// Create the transition object. 
IAMTimelineObj *pTransObj = NULL;
hr = pTL->CreateEmptyNode(&pTransObj, TIMELINE_MAJOR_TYPE_TRANSITION);

// Set the subobject. 
hr = pTransObj->SetSubObjectGUID(CLSID_DxtJpeg);  // SMPTE Wipe

// Set the start and stop times. 
hr = pTransObj->SetStartStop(50000000, 100000000);

// Insert the transition object into the timeline. 
IAMTimelineTransable *pTransable = NULL;
hr = pTrack->QueryInterface(IID_IAMTimelineTransable, (void **)&pTransable);
hr = pTransable->TransAdd(pTransObj);  
pTransable->Release();
pTransObj->Release();

Trabalhando com efeitos e transições