Bagikan melalui


Sambungkan Dua Filter

[Fitur yang terkait dengan halaman ini, DirectShow, adalah fitur warisan. Ini telah digantikan oleh MediaPlayer, IMFMediaEngine, dan Tangkapan Audio/Video di Media Foundation. Fitur-fitur tersebut telah dioptimalkan untuk Windows 10 dan Windows 11. Microsoft sangat menyarankan agar kode baru menggunakan MediaPlayer, IMFMediaEngine dan Audio/Video Capture di Media Foundation alih-alih DirectShow, jika memungkinkan. Microsoft menyarankan agar kode yang ada yang menggunakan API warisan ditulis ulang untuk menggunakan API baru jika memungkinkan.]

Topik ini menunjukkan beberapa fungsi pembantu untuk menyambungkan filter DirectShow.

Untuk menyambungkan dua filter, Anda harus menemukan pin output yang tidak terhubung pada filter upstram, dan pin input yang tidak terhubung pada filter hilir.

Jika Anda sudah memiliki pointer ke kedua pin, panggil metode IGraphBuilder::Connect untuk menyambungkannya. Jika pin tidak dapat terhubung langsung satu sama lain, metode IGraphBuilder::Connect mungkin menyisipkan filter tambahan, untuk menyelesaikan koneksi. Untuk informasi selengkapnya, lihat Intelligent Connect.

Jika Anda memiliki penunjuk ke filter tetapi bukan pin, Anda harus menggunakan metode IBaseFilter::EnumPins untuk menemukan pin. (Lihat Menghitung pin.) Fungsi pembantu dalam topik ini menunjukkan teknik ini.

Pin Output ke Filter

Fungsi berikut mengambil dua parameter: Penunjuk ke pin output, dan penunjuk ke filter. Fungsi ini menyambungkan pin output ke pin input pertama yang tersedia pada filter.

// Connect output pin to filter.

HRESULT ConnectFilters(
    IGraphBuilder *pGraph, // Filter Graph Manager.
    IPin *pOut,            // Output pin on the upstream filter.
    IBaseFilter *pDest)    // Downstream filter.
{
    IPin *pIn = NULL;
        
    // Find an input pin on the downstream filter.
    HRESULT hr = FindUnconnectedPin(pDest, PINDIR_INPUT, &pIn);
    if (SUCCEEDED(hr))
    {
        // Try to connect them.
        hr = pGraph->Connect(pOut, pIn);
        pIn->Release();
    }
    return hr;
}

Fungsi ini melakukan hal berikut:

  1. FindUnconnectedPin Memanggil fungsi untuk mendapatkan pin input yang tidak terhubung. Fungsi ini diperlihatkan dalam topik Temukan Pin Yang Tidak Tersambung pada Filter.
  2. Memanggil IGraphBuilder::Connect untuk menyambungkan dua pin.

Filter ke Pin Input

Fungsi berikutnya mengambil penunjuk ke filter dan penunjuk ke pin input. Ini menghubungkan pin input ke pin output pertama yang tersedia pada filter.

// Connect filter to input pin.

HRESULT ConnectFilters(IGraphBuilder *pGraph, IBaseFilter *pSrc, IPin *pIn)
{
    IPin *pOut = NULL;
        
    // Find an output pin on the upstream filter.
    HRESULT hr = FindUnconnectedPin(pSrc, PINDIR_OUTPUT, &pOut);
    if (SUCCEEDED(hr))
    {
        // Try to connect them.
        hr = pGraph->Connect(pOut, pIn);
        pOut->Release();
    }
    return hr;
}

Filter untuk Memfilter

Fungsi ketiga mengambil penunjuk ke filter hulu dan penunjuk ke filter hilir, dan mencoba menyambungkan kedua filter.

// Connect filter to filter

HRESULT ConnectFilters(IGraphBuilder *pGraph, IBaseFilter *pSrc, IBaseFilter *pDest)
{
    IPin *pOut = NULL;

    // Find an output pin on the first filter.
    HRESULT hr = FindUnconnectedPin(pSrc, PINDIR_OUTPUT, &pOut);
    if (SUCCEEDED(hr))
    {
        hr = ConnectFilters(pGraph, pOut, pDest);
        pOut->Release();
    }
    return hr;
}

Teknik Graph-Building Umum

ICaptureGraphBuilder2::RenderStream