다음을 통해 공유


효과 및 전환에 속성 설정

[이 페이지와 연결된 기능인 DirectShow는 레거시 기능입니다. MediaPlayer, IMFMediaEngine 및 Media Foundation의 오디오/비디오 캡처로 대체되었습니다. 이러한 기능은 Windows 10 및 Windows 11 최적화되었습니다. 가능한 경우 새 코드가 DirectShow 대신 Media Foundation에서 MediaPlayer, IMFMediaEngine오디오/비디오 캡처를 사용하는 것이 좋습니다. 가능한 경우 레거시 API를 사용하는 기존 코드를 다시 작성하여 새 API를 사용하도록 제안합니다.]

[이 API는 지원되지 않으며 나중에 변경되거나 사용할 수 없습니다.]

많은 DirectShow Editing Services 효과 및 전환은 동작을 제어하는 속성을 지원합니다. 애플리케이션은 IPropertySetter 인터페이스를 사용하여 속성의 값을 설정할 수 있습니다. 기본 효과 또는 전환 개체는 속성을 설정하기 위해 IDispatch 를 지원해야 합니다. 비디오 효과 및 전환을 통해 애플리케이션은 시간이 지남에 따라 변경되는 값의 범위를 설정할 수 있습니다. (예를 들어 초기화 전환을 설정하여 프레임을 앞뒤로 이동할 수 있습니다.) 오디오 효과를 사용하면 속성 값이 정적이며 시간이 지남에 따라 변경할 수 없습니다. 유일한 예외는 볼륨 수준에 대한 동적 속성을 지원하는 볼륨 봉투 효과입니다.

속성을 설정하려면 다음 단계를 수행합니다.

  1. 속성 setter(CLSID_PropertySetter)의 instance 만듭니다.
  2. 속성 데이터로 DEXTER_PARAMDEXTER_VALUE 구조체를 채웁니다. 이러한 구조는 아래에 설명되어 있습니다.
  3. DEXTER_PARAMDEXTER_VALUE 구조를 IPropertySetter::AddProp 메서드에 전달합니다.
  4. 설정하려는 각 속성에 대해 2단계와 3단계를 반복합니다.
  5. IAMTimelineObj::SetPropertySetter 메서드에 IPropertySetter 인터페이스 포인터를 전달합니다.

DEXTER_PARAM 구조체는 설정되는 속성을 지정합니다. 여기에는 다음 멤버가 포함됩니다.

  • 이름: 속성의 이름
  • dispID: 예약됨, 0이어야 합니다.
  • nValues: 값 수

DEXTER_VALUE 구조체는 지정된 시간에 속성의 값을 지정합니다. 여기에는 다음 멤버가 포함됩니다.

  • v: 속성에 대한 새 값을 지정하는 VARIANT 형식입니다. 이 VARIANT의 vt 멤버는 속성의 데이터 형식을 정의합니다. VARIANT 형식에 대한 자세한 내용은 Windows SDK를 참조하세요.
  • rt: 속성이 효과 또는 전환의 시작 시간을 기준으로 이 값을 가정하는 참조 시간입니다. 효과 또는 전환의 시작 시간은 부모 개체의 시작 시간을 기준으로 합니다.
  • dwInterp: 속성이 이전 값에서 새 값으로 변경되는 방식을 지정하는 플래그입니다. DEXTERF_JUMP 플래그를 사용하면 지정된 시간에 속성이 즉시 새 값으로 이동합니다. DEXTERF_INTERPOLATE 플래그를 사용하면 속성이 이전 값에서 선형으로 보간됩니다.

vt 멤버를 VT_BSTR 설정하면 속성 setter는 필요한 모든 변환을 만듭니다. 부동 소수점 값의 경우 소수점 앞에 선행 0을 포함합니다. 예를 들어 .3이 아닌 0.3입니다.

참고

애플리케이션은 BSTR에서 숫자 값으로의 변환에 의존하지 않아야 합니다. 속성에 숫자 값이 있는 경우 적절한 숫자 VARIANT 형식을 사용할 수 있습니다.

 

속성 값은 시간이 지남에 따라 변경되므로 IPropertySetter::AddProp 메서드는 단일 DEXTER_PARAM 구조체와 DEXTER_VALUE 구조체 배열에 대한 포인터를 사용합니다. 배열은 속성에 대한 시간 기반 값 집합을 정의합니다. 배열의 멤버는 오름차순이어야 하며, DEXTER_PARAM 구조체의 nValues 멤버는 배열의 길이와 같아야 합니다.

다음 코드 예제에서는 SMPTE 초기화 전환에 대한 속성 데이터를 만듭니다. 초기화 코드를 120으로 설정하여 타원형 초기화를 만듭니다. 참조 시간을 0으로 설정하여 전환의 시작을 나타냅니다.

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();

동적으로 속성 변경

비디오 편집 프로젝트를 렌더링한 후에는 그래프가 실행되는 동안 효과를 수정하거나 개체의 속성을 전환할 수 있습니다. 그러나 IRenderEngine::ConnectFrontEnd라는 애플리케이션 앞에 해당 개체의 속성을 설정하는 경우에만 가능합니다. 이 경우 효과 또는 전환에 대해 IAMTimelineObj::GetPropertySetter 를 호출하고 속성을 지우거나 수정할 수 있으며 그래프가 실행될 때 변경 내용이 동적으로 발생합니다. 변경이 발생하는 동안 시각적 변칙이 있을 수 있으므로 미리 보기에만 권장됩니다. 파일을 작성하는 동안에는 속성을 변경하지 마세요.

ConnectFrontEnd를 호출하기 전에 효과 또는 전환 개체에 대한 속성을 설정하지 않은 경우 그래프가 실행되는 동안에는 속성을 추가할 수 없습니다.

효과 및 전환 작업