Condividi tramite


Passaggio 1: Dichiarare la classe DShowPlayer

[La funzionalità associata a questa pagina, DirectShow, è una funzionalità legacy. È stata sostituita da MediaPlayer, IMFMediaEnginee Acquisizione audio/video in Media Foundation. Queste funzionalità sono state ottimizzate per Windows 10 e Windows 11. Microsoft consiglia vivamente di usare un nuovo codice MediaPlayer, IMFMediaEngine e Acquisizione audio/video in Media Foundation anziché DirectShow, quando possibile. Microsoft suggerisce che il codice esistente che usa le API legacy venga riscritto per usare le nuove API, se possibile.

Questo argomento è il passaggio 1 della lezione Riproduzione audio/video in DirectShow. Il codice completo è illustrato nell'argomento "Esempio di Riproduzione DirectShow".

In questa esercitazione, la classe DShowPlayer gestisce tutte le funzionalità DirectShow. Questa classe viene dichiarata come segue.

#include <new>
#include <windows.h>
#include <dshow.h>


enum PlaybackState
{
    STATE_NO_GRAPH,
    STATE_RUNNING,
    STATE_PAUSED,
    STATE_STOPPED,
};

const UINT WM_GRAPH_EVENT = WM_APP + 1;

typedef void (CALLBACK *GraphEventFN)(HWND hwnd, long eventCode, LONG_PTR param1, LONG_PTR param2);

class DShowPlayer
{
public:
    DShowPlayer(HWND hwnd);
    ~DShowPlayer();

    PlaybackState State() const { return m_state; }

    HRESULT OpenFile(PCWSTR pszFileName);
    
    HRESULT Play();
    HRESULT Pause();
    HRESULT Stop();

    BOOL    HasVideo() const;
    HRESULT UpdateVideoWindow(const LPRECT prc);
    HRESULT Repaint(HDC hdc);
    HRESULT DisplayModeChanged();

    HRESULT HandleGraphEvent(GraphEventFN pfnOnGraphEvent);

private:
    HRESULT InitializeGraph();
    void    TearDownGraph();
    HRESULT CreateVideoRenderer();
    HRESULT RenderStreams(IBaseFilter *pSource);

    PlaybackState   m_state;

    HWND m_hwnd; // Video window. This window also receives graph events.

    IGraphBuilder   *m_pGraph;
    IMediaControl   *m_pControl;
    IMediaEventEx   *m_pEvent;
    CVideoRenderer  *m_pVideo;
};

Note:

  • L'enumerazione PlaybackState descrive lo stato corrente dell'oggetto DShowPlayer.
  • La costante WM_GRAPH_EVENT definisce un messaggio di finestra privata. Questo messaggio viene usato per notificare all'applicazione gli eventi del grafico di filtro. Consulta Passaggio 6: Gestire gli eventi del grafico.
  • GraphEventFN è un puntatore a una funzione di callback per la gestione degli eventi del grafo del filtro. L'applicazione implementa questa funzione di callback.
  • La variabile membro m_pVideo fornisce un wrapper per i vari renderer video DirectShow. Consultare Passaggio 2: Dichiarare le classi CVideoRenderer e quelle derivate.
  • In questa esercitazione viene usata la funzione SafeRelease per rilasciare puntatori all'interfaccia COM.

Avanti: Passaggio 2: Dichiara CVideoRenderer e le sue classi derivate.

Riproduzione Audio/Video in DirectShow