효과 및 전환 개체 추가

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

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

DES에서 효과 또는 전환은 다음 두 개체로 표시됩니다.

효과 또는 전환을 추가하려면 다음 단계를 수행합니다.

1. Timeline 개체 만들기

타임라인 개체를 만들려면 IAMTimeline::CreateEmptyNode 메서드를 호출합니다. 형식을 효과의 TIMELINE_MAJOR_TYPE_EFFECT 또는 전환의 TIMELINE_MAJOR_TYPE_TRANSITION 같게 설정합니다.

다음 예제에서는 전환 개체를 만듭니다.

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

2. 하위 개체 지정

타임라인 개체는 실제 작업을 수행하는 하위 개체라는 다른 개체의 래퍼 역할을 합니다. 하위 개체는 원하는 효과 또는 전환을 생성하는 데이터 변환을 구현합니다. DES와 함께 제공되는 전환 및 효과 목록은 전환 및 효과를 참조하세요.

하위 개체를 설정하려면 타임라인 개체에서 IAMTimelineObj::SetSubObjectGUID 메서드를 호출하여 하위 개체의 CLSID(클래스 식별자)를 전달합니다. DirectShow는 CLSID를 가져오는 데 사용할 수 있는 비디오 효과 및 비디오 전환에 대한 열거자를 제공합니다. 자세한 내용은 효과 및 전환 열거를 참조하세요.

다음 예제에서는 SMPTE 초기화 전환을 하위 개체로 설정합니다.

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

3. 시작 및 중지 시간 설정

시작 및 중지 시간을 설정하려면 IAMTimelineObj::SetStartStop 메서드를 호출합니다. 이러한 시간은 부모 개체의 시작 시간을 기준으로 합니다. 효과는 동일한 개체 내에서 겹칠 수 있지만 전환은 할 수 없습니다.

다음 예제에서는 시작 시간을 5초로 설정하고 중지 시간을 10초로 설정합니다.

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

전환이 렌더링되면 각 프레임의 전환 진행률이 Progress 속성을 기반으로 계산되며, 이 속성은 0.0에서 1.0 범위로 정규화됩니다. DES는 각 프레임의 시작 시간을 사용하여 진행률 값을 계산합니다. 즉, 전환 중지 시간이 원본 중지 시간과 같으면 마지막 프레임의 시작 시간이 중지 시간보다 약간 크므로 진행률 값이 정확히 1.0에 도달하지 않습니다. 전환이 1.0에 도달하도록 하려면 전환 중지 시간을 원본 중지 시간보다 1프레임 이상으로 설정합니다.

4. 타임라인에 개체 삽입

개체를 타임라인 삽입하려면 개체 형식에 따라 부모에서 다음 메서드 중 하나를 호출합니다.

IAMTimelineEffectable::EffectInsBefore 메서드에서 효과의 우선 순위를 지정해야 합니다. 효과가 동일한 개체에 겹치면 우선 순위에 따라 적용됩니다. 볼륨 봉투 오디오 효과는 예외입니다. 자세한 내용은 볼륨 봉투 효과 참조를 참조하세요. 컴퍼지션 내에서 모든 오디오 트랙은 해당 컴퍼지션에 대한 오디오 효과가 적용되기 전에 혼합됩니다.

전환은 동일한 개체에서 겹칠 수 없으므로 우선 순위 값이 없습니다.

다음 예제에서는 전환 개체를 트랙에 추가합니다.

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

이 예제에서는 AddTrans를 호출하기 전에 IAMTimelineTransable 인터페이스에 대한 트랙 개체를 쿼리합니다.

5. 속성 설정

많은 효과 및 전환은 사용자 지정 속성을 지원합니다. 자세한 내용은 효과 및 전환에 속성 설정을 참조하세요.

예제

다음 코드 예제에서는 트랙에 SMPTE 초기화 전환을 추가합니다. 트랙 개체가 이미 타임라인 있다고 가정합니다.

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

효과 및 전환 작업