다음을 통해 공유


6단계: 그래프 이벤트 처리

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

이 항목은 DirectShow의 오디오/비디오 재생 자습서의 6단계입니다. 전체 코드는 DirectShow 재생 예제 항목에 나와 있습니다.

애플리케이션이 Filter Graph Manager의 새 instance 만들면 애플리케이션은 IMediaEventEx::SetNotifyWindow를 호출합니다. 이 메서드는 필터 그래프에서 이벤트를 수신하도록 애플리케이션 창을 등록합니다.

    hr = m_pGraph->QueryInterface(IID_PPV_ARGS(&m_pEvent));
    if (FAILED(hr))
    {
        goto done;
    }

    // Set up event notification.
    hr = m_pEvent->SetNotifyWindow((OAHWND)m_hwnd, WM_GRAPH_EVENT, NULL);
    if (FAILED(hr))
    {
        goto done;
    }

WM_GRAPH_EVENT 은 프라이빗 창 메시지입니다. 애플리케이션이 이 메시지를 받을 때마다 메서드를 호출합니다 DShowPlayer::HandleGraphEvent .

    case WM_GRAPH_EVENT:
       g_pPlayer->HandleGraphEvent(OnGraphEvent);
       return 0;

DShowPlayer::HandleGraphEvent 메서드는 다음 작업을 수행합니다.

  1. 루프에서 IMediaEvent::GetEvent 를 호출하여 대기 중인 모든 이벤트를 가져옵니다.
  2. 콜백 함수(pfnOnGraphEvent)를 호출합니다.
  3. IMediaEvent::FreeEventParams를 호출하여 각 이벤트와 연결된 데이터를 해제합니다.
// Respond to a graph event.
//
// The owning window should call this method when it receives the window
// message that the application specified when it called SetEventWindow.
//
// Caution: Do not tear down the graph from inside the callback.

HRESULT DShowPlayer::HandleGraphEvent(GraphEventFN pfnOnGraphEvent)
{
    if (!m_pEvent)
    {
        return E_UNEXPECTED;
    }

    long evCode = 0;
    LONG_PTR param1 = 0, param2 = 0;

    HRESULT hr = S_OK;

    // Get the events from the queue.
    while (SUCCEEDED(m_pEvent->GetEvent(&evCode, &param1, &param2, 0)))
    {
        // Invoke the callback.
        pfnOnGraphEvent(m_hwnd, evCode, param1, param2);

        // Free the event data.
        hr = m_pEvent->FreeEventParams(evCode, param1, param2);
        if (FAILED(hr))
        {
            break;
        }
    }
    return hr;
}

다음 코드는 에 전달되는 콜백 함수를 DShowPlayer::HandleGraphEvent보여줍니다. 함수는 그래프 이벤트(EC_COMPLETE, EC_ERRORABORTEC_USERABORT)의 최소 수를 처리합니다. 함수를 확장하여 추가 이벤트를 처리할 수 있습니다.

void CALLBACK OnGraphEvent(HWND hwnd, long evCode, LONG_PTR param1, LONG_PTR param2)
{
    switch (evCode)
    {
    case EC_COMPLETE:
    case EC_USERABORT:
        g_pPlayer->Stop();
        break;

    case EC_ERRORABORT:
        NotifyError(hwnd, L"Playback error.");
        g_pPlayer->Stop();
        break;
    }
}

DirectShow의 오디오/비디오 재생

DirectShow 재생 예제

DirectShow의 이벤트 알림

이벤트에 응답