Bagikan melalui


Mengontrol Capture Graph

[Fitur yang terkait dengan halaman ini, DirectShow, adalah fitur warisan. Ini telah digantikan oleh MediaPlayer, IMFMediaEngine, dan Pengambilan 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 Pengambilan Audio/Video 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.]

Antarmuka IMediaControl Filter Graph Manager memiliki metode untuk menjalankan, menghentikan, dan menjeda seluruh grafik. Namun, jika grafik filter memiliki aliran pengambilan dan pratinjau, Anda mungkin ingin mengontrol dua aliran secara independen. Misalnya, Anda mungkin ingin mempratinjau video tanpa menangkapnya. Anda dapat melakukan ini melalui metode ICaptureGraphBuilder2::ControlStream .

Catatan

Metode ini tidak berfungsi saat menangkap file Advanced Systems Format (ASF).

 

Mengontrol Capture Stream

Kode berikut mengatur aliran pengambilan video agar berjalan selama empat detik, dimulai satu detik setelah grafik berjalan:

// Control the video capture stream. 
REFERENCE_TIME rtStart = 10000000, rtStop = 50000000;
const WORD wStartCookie = 1, wStopCookie = 2;  // Arbitrary values.
hr = pBuild->ControlStream(
    &PIN_CATEGORY_CAPTURE, // Pin category.
    &MEDIATYPE_Video,      // Media type.
    pCap,                 // Capture filter.
    &rtStart, &rtStop,     // Start and stop times.
    wStartCookie, wStopCookie  // Values for the start and stop events.
);
pControl->Run();

Parameter pertama menentukan aliran mana yang akan dikontrol, sebagai GUID kategori pin. Parameter kedua memberikan jenis media. Parameter ketiga adalah penunjuk ke filter pengambilan. Untuk mengontrol semua aliran pengambilan dalam grafik, atur parameter kedua dan ketiga ke NULL.

Dua parameter berikutnya menentukan waktu ketika aliran akan dimulai dan dihentikan, relatif terhadap waktu ketika grafik mulai berjalan. Panggil IMediaControl::Run untuk menjalankan grafik. Hingga Anda menjalankan grafik, metode ControlStream tidak berpengaruh. Jika grafik sudah berjalan, pengaturan akan segera berlaku.

Dua parameter terakhir digunakan untuk mendapatkan pemberitahuan peristiwa saat streaming dimulai dan dihentikan. Untuk setiap aliran yang Anda kontrol menggunakan metode ini, grafik filter mengirimkan sepasang peristiwa: EC_STREAM_CONTROL_STARTED saat aliran dimulai, dan EC_STREAM_CONTROL_STOPPED saat aliran berhenti. Nilai wStartCookie dan wStopCookie digunakan sebagai parameter peristiwa kedua. Dengan demikian, lParam2 dalam acara awal sama dengan wStartCookie, dan lParam2 dalam acara berhenti sama dengan wStopCookie. Kode berikut menunjukkan cara mendapatkan peristiwa ini:

while (hr = pEvent->GetEvent(&evCode, &param1, &param2, 0), SUCCEEDED(hr))
{
    switch (evCode)
    {
    case EC_STREAM_CONTROL_STARTED: 
    // param2 == wStartCookie
    break;

    case EC_STREAM_CONTROL_STOPPED: 
    // param2 == wStopCookie
    break;
    
    } 
    pEvent->FreeEventParams(evCode, param1, param2);
}

Metode ControlStream mendefinisikan beberapa nilai khusus untuk waktu mulai dan berhenti.

Nilai Mulai Hentikan
MAXLONGLONG Jangan pernah memulai aliran ini. Jangan berhenti sampai grafik berhenti.
NULL Mulai segera saat grafik berjalan. Berhenti segera.

 

Misalnya, kode berikut segera menghentikan aliran pengambilan:

pBuild->ControlStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video, pCap,
    0, 0,     // Start and stop times.
    wStartCookie, wStopCookie); 

Meskipun Anda dapat menghentikan aliran pengambilan dan memulai ulang nanti, ini akan membuat celah dalam stempel waktu. Pada pemutaran, video akan muncul untuk diperlambat selama kesenjangan (tergantung pada format file).

Mengontrol Aliran Pratinjau

Untuk mengontrol pin pratinjau, panggil ControlStream tetapi atur parameter pertama ke PIN_CATEGORY_PREVIEW. Ini berfungsi seperti yang dilakukan untuk PIN_CATEGORY_CAPTURE, kecuali bahwa Anda tidak dapat menggunakan waktu referensi untuk menentukan awal dan berhenti, karena bingkai pratinjau tidak memiliki stempel waktu. Oleh karena itu, Anda harus menggunakan NULL atau MAXLONGLONG. Gunakan NULL untuk memulai aliran pratinjau:

pBuild->ControlStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, pCap,
    NULL,    // Start now.
    0,       // (Don't care.)
    wStartCookie, wStopCookie); 

Gunakan MAXLONGLONG untuk menghentikan aliran pratinjau:

pBuild->ControlStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, pCap,
    0,               // (Don't care.)
    MAXLONGLONG,     // Stop now.
    wStartCookie, wStopCookie); 

Tidak masalah apakah aliran pratinjau berasal dari pin pratinjau pada filter tangkapan, atau dari filter Smart Tee. Metode ControlStream berfungsi dengan cara apa pun.

Namun, untuk pin port video, metode ini akan gagal. Dalam hal ini, pendekatan lain adalah menyembunyikan jendela video. Kueri grafik untuk IVideoWindow, dan gunakan metode IVideoWindow::p ut_Visible untuk memperlihatkan atau menyembunyikan jendela.

// Hide the video window.
IVideoWindow *pVidWin = 0;
hr = pGraph->QueryInterface(IID_IVideoWindow, (void**)&pVidWin);
if (SUCCEEDED(hr))
{
    pVidWin->put_Visible(OAFALSE);
    pVidWin->Release();
}

Selain itu, jika Anda memanggil IVideoWindow::p ut_AutoShow dengan nilai OAFALSE sebelum Anda menjalankan grafik, filter Video Renderer menyembunyikan jendela hingga Anda menentukan sebaliknya. Secara default, Video Renderer menampilkan jendela saat Anda menjalankan grafik.

Keterangan tentang Kontrol Aliran

Perilaku default untuk pin adalah mengirimkan sampel saat grafik berjalan. Misalnya, Anda memanggil ControlStream dengan PIN_CATEGORY_CAPTURE tetapi tidak dengan PIN_CATEGORY_PREVIEW. Saat Anda menjalankan grafik, aliran pratinjau akan segera berjalan, sementara aliran pengambilan akan berjalan pada waktu apa pun yang Anda tentukan di ControlStream.

Jika Anda menangkap lebih dari satu streaming dan mengirimkannya ke filter mux — misalnya, jika Anda menangkap audio dan video ke file AVI — Anda harus mengontrol kedua aliran secara bersamaan. Jika tidak, filter muks mungkin memblokir menunggu satu aliran, karena mencoba untuk menjalin dua aliran. Atur waktu mulai dan berhenti yang sama pada semua aliran pengambilan sebelum menjalankan grafik:

pBuild->ControlStream(&PIN_CATEGORY_CAPTURE, 
    
NULL, NULL,       // All capture streams.
    &rtStart, rtStop, 
    wStartCookie, wStopCookie); 

Secara internal, metode ControlStream menggunakan antarmuka IAMStreamControl , yang diekspos pada pin filter pengambilan, filter Smart Tee (jika ada), dan mungkin filter mux. Anda dapat menggunakan antarmuka ini secara langsung, alih-alih memanggil ControlStream, meskipun tidak ada keuntungan khusus untuk melakukannya.

Pengambilan Video