Definindo propriedades em efeitos e transições

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

Muitos efeitos e transições do DirectShow Editing Services dão suporte a propriedades que controlam seu comportamento. Um aplicativo pode definir o valor de uma propriedade usando a interface IPropertySetter . O efeito subjacente ou objeto de transição deve dar suporte a IDispatch para definir as propriedades. Com efeitos de vídeo e transições, o aplicativo pode definir um intervalo de valores que mudam ao longo do tempo. (Por exemplo, você pode definir uma transição de apagamento para se mover para frente e para trás no quadro.) Com efeitos de áudio, o valor da propriedade é estático e não pode ser alterado ao longo do tempo. A única exceção é o efeito Envelope de Volume , que dá suporte a uma propriedade dinâmica para o nível de volume.

Para definir uma propriedade, execute as etapas a seguir.

  1. Crie uma instância do setter de propriedade (CLSID_PropertySetter).
  2. Preencha estruturas de DEXTER_PARAM e DEXTER_VALUE com os dados da propriedade. Essas estruturas são discutidas abaixo.
  3. Passe as estruturas de DEXTER_PARAM e DEXTER_VALUE para o método IPropertySetter::AddProp .
  4. Repita as etapas 2 e 3 para cada propriedade que você deseja definir.
  5. Passe o ponteiro da interface IPropertySetter para o método IAMTimelineObj::SetPropertySetter .

A estrutura DEXTER_PARAM especifica qual propriedade está sendo definida. Ele contém os membros a seguir.

  • Nome: nome da propriedade
  • dispID: Reservado, deve ser zero
  • nValues: número de valores

A estrutura DEXTER_VALUE especifica o valor de uma propriedade em um determinado momento. Ele contém os membros a seguir.

  • v: tipo VARIANT que especifica um novo valor para a propriedade . O membro vt dessa VARIANT define o tipo de dados da propriedade . Para obter mais informações sobre o tipo VARIANT , consulte o SDK do Windows.
  • rt: tempo de referência em que a propriedade pressupõe esse valor, em relação à hora inicial do efeito ou da transição. A hora de início do efeito ou transição é relativa à hora de início de seu objeto pai.
  • dwInterp: sinalizador que especifica como a propriedade muda do valor anterior para o novo valor. Com o sinalizador DEXTERF_JUMP, a propriedade salta instantaneamente para o novo valor no momento especificado. Com o sinalizador DEXTERF_INTERPOLATE, a propriedade é interpolada linearmente do valor anterior.

Se você definir o membro vt como VT_BSTR, o setter de propriedade fará as conversões necessárias. Para valores de ponto flutuante, inclua o zero à esquerda antes do local decimal. Por exemplo, 0.3, não .3.

Observação

Os aplicativos devem evitar depender da conversão de BSTRspara valores numéricos. Se a propriedade tiver um valor numérico, use o tipo VARIANT numérico apropriado.

 

O valor de uma propriedade pode ser alterado ao longo do tempo, portanto, o método IPropertySetter::AddProp usa uma única estrutura DEXTER_PARAM e um ponteiro para uma matriz de estruturas de DEXTER_VALUE . A matriz define um conjunto de valores baseados em tempo para a propriedade . Os membros da matriz devem estar em ordem de tempo crescente e o membro nValues da estrutura DEXTER_PARAM deve ser igual ao comprimento da matriz.

O exemplo de código a seguir cria dados de propriedade para a transição de Apagamento SMPTE . Ele define o código de apagamento como 120, o que cria um apagamento oval. Ele define o tempo de referência como zero, indicando o início da transição.

IPropertySetter     *pProp;   // Property setter
IAMTimelineObj      *pTransObj;  // Transition object
// Create an SMPTE Wipe transition object. (Not shown)

hr = CoCreateInstance(CLSID_PropertySetter, NULL, CLSCTX_INPROC_SERVER,
    IID_IPropertySetter, (void**) &pProp);

// Error checking is omitted for clarity...

DEXTER_PARAM param;
DEXTER_VALUE *pValue = (DEXTER_VALUE*)CoTaskMemAlloc(sizeof(DEXTER_VALUE));

// Initialize the parameter. 
param.Name = SysAllocString(L"MaskNum");
param.dispID = 0;
param.nValues = 1;

// Initialize the value.
pValue->v.vt = VT_I4;
pValue->v.lVal = 120; // Oval
pValue->rt = 0;
pValue->dwInterp = DEXTERF_JUMP;

pProp->AddProp(param, pValue);

// Free allocated resources.
SysFreeString(param.Name);
VariantClear(&(pValue->v));
CoTaskMemFree(pValue);

// Set the property on the transition.
pTransObj->SetPropertySetter(pProp);
pProp->Release();

Alterando dinamicamente as propriedades

Depois de renderizar um projeto de edição de vídeo, é possível modificar as propriedades de um efeito ou de um objeto de transição enquanto o grafo está em execução. No entanto, isso só será possível se você definir propriedades nesse objeto antes do aplicativo chamado IRenderEngine::ConnectFrontEnd. Nesse caso, você pode chamar IAMTimelineObj::GetPropertySetter no efeito ou transição, limpar ou modificar as propriedades e as alterações ocorrerão dinamicamente à medida que o grafo estiver em execução. Pode haver anomalias visuais enquanto a alteração ocorre, portanto, isso é recomendado apenas para visualização. Não altere as propriedades enquanto estiver gravando o projeto em um arquivo.

Se você não definiu nenhuma propriedade no objeto de efeito ou transição antes de chamar ConnectFrontEnd, não poderá adicionar propriedades a ele enquanto o grafo estiver em execução.

Trabalhando com efeitos e transições