2012-01-08 12 views
3

DirectShow DSPACK 컴포넌트 스위트를 사용하는 Delphi 6 애플리케이션이 있습니다. 필터 그래프의 이미지를 렌더링하는 TVideoWindow 구성 요소가 있습니다. TVideoWindow 구성 요소는 페이지 구성 요소의 탭에 있습니다. 필터 그래프를 실행할 때 탭이 보이면 비디오가 잘 보입니다. 또한 다른 탭으로 전환하여 다시 돌아올 수 있으며 동영상은 여전히 ​​괜찮습니다. 그러나 탭이 표시되지 않은 상태에서 필터 그래프를 실행하면 해당 탭으로 전환 할 때 비디오 창 영역이 검정색입니다. 다른 탭으로 전환하고 다시 시도하여 호스트 양식을 최소화하고 복원했습니다. 이것이 창/컴포넌트 핸들링 라이프 사이클 문제인 지 궁금합니다. 이 문제를 어떻게 해결할 수 있습니까?호스트 탭이 보이지 않을 때 그래프가 시작되면 DirectShow 렌더 윈도우가 검은 색으로 보임 (TVideoWindow)

+0

이 필요합니다. 불행히도 고정하지 마십시오 – Simon

+0

호스팅 창이 표시 될 때까지 시작 연기 (실제로, VMR/EVR 초기화)는 어떻게됩니까? –

+0

@RomanR. - 그렇게하는 코드를 추가했습니다. 다소 효과가 있지만 방탄이 아닙니다. 이 게시물의 정보를 사용하여 창이 표시되는지 확인했습니다. http://stackoverflow.com/questions/646527/how-can-i-tell-if-a-delphi-control-is-currently-visible. 도움이 되긴하지만 때로는 "검은 창"을 얻습니다. 아직 코드를 수정 중입니다. –

답변

2

이후에 표시되는 숨겨진 패널에 EVR을 설정하는 것과 같이 COM 개체를 직접 사용할 때이 문제가 발생하지 않습니다. TVideoWindow를 없애고 VMR9 및 EVR과 같은 렌더링을 직접 사용하면 시간이 더 많이 걸릴 것이라고 생각합니다. 당신은

FDisplayControl: IMFVideoDisplayControl; 
    FEVR: IBaseFilter; 
    R: TNormalizedRect; 
    R: TRect; 

    hr := Succeeded(CoCreateInstance(CLSID_EnhancedVideoRenderer, nil, CLSCTX_INPROC, IID_IBaseFilter, FEVR)); 
    if (hr <> S_OK) then 
    begin 
    showmessage(GetErrorString(hr) + ' (Could not create the enhanced video renderer : ' + inttohex(hr,8) + ')'); 
    Exit; 
    end; 
    (FilterGraph as IFilterGraph2).AddFilter().AddFilter(FEVR, PWideChar(WideString('EVR'))); 
    (FEVR as IMFGetService).GetService(MR_VIDEO_RENDER_SERVICE, IID_IMFVideoDisplayControl, FDisplayControl); 
    FDisplayControl.SetVideoWindow(Panel.Handle); 
    NR.Left := 0; 
    NR.Top := 0; 
    NR.Right := 1; 
    NR.Bottom := 1; 
    R := ClientRect; 
    FDisplayControl.SetVideoPosition(@nr, @r); 
    FDisplayControl.SetAspectRatioMode(MFVideoARMode_None); 

주의 라인을 따라이, 뭔가를 DSPack을 제거 할 필요가 없습니다 : 위의 나도이 문제가 있었다 EVR.pas

+0

나는 그 기술을 시험해보고 나중에 결과를 게시 할 것이다. –