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.
- Crie uma instância do setter de propriedade (CLSID_PropertySetter).
- Preencha estruturas de DEXTER_PARAM e DEXTER_VALUE com os dados da propriedade. Essas estruturas são discutidas abaixo.
- Passe as estruturas de DEXTER_PARAM e DEXTER_VALUE para o método IPropertySetter::AddProp .
- Repita as etapas 2 e 3 para cada propriedade que você deseja definir.
- 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.
Tópicos relacionados