Bagikan melalui


Mengontrol Grafik Pengambilan

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

Nota

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

 

Mengontrol Aliran Pengambilan

Kode berikut mengatur aliran pengambilan video untuk dijalankan 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 pointer 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::Jalankan 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 streaming dimulai, dan EC_STREAM_CONTROL_STOPPED saat streaming berhenti. Nilai wStartCookie dan wStopCookie digunakan sebagai parameter peristiwa kedua. Dengan demikian, lParam2 dalam acara mulai 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 menentukan beberapa nilai khusus untuk waktu mulai dan berhenti.

Nilai Mulai Berhenti
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 tangkapan dan memulai ulang nanti, akan ada celah dalam stempel waktu. Pada pemutaran, video akan tampak terhenti selama jeda (tergantung pada format file).

Mengontrol Aliran Pratinjau

Untuk mengontrol pin pratinjau, panggil ControlStream tetapi atur parameter pertama ke PIN_CATEGORY_PREVIEW. Ini berfungsi seperti pada PIN_CATEGORY_CAPTURE, kecuali Anda tidak dapat menggunakan waktu referensi untuk menentukan awal dan berhenti, karena frame pratinjau tidak memiliki cap 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 pengambilan, atau dari filter Smart Tee. Metode ControlStream berfungsi dengan kedua cara.

Namun, untuk pin port video, metode akan gagal. Dalam hal ini, pendekatan lain adalah menyembunyikan jendela video. Kueri graf untuk IVideoWindow, dan gunakan metode IVideoWindow::put_Visible untuk menampilkan 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::put_AutoShow dengan nilai OAFALSE sebelum Anda menjalankan grafis, filter Video Renderer menyembunyikan jendela hingga Anda mengatur 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 kapan pun yang Anda tentukan di ControlStream.

Jika Anda menangkap lebih dari satu aliran 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 mux mungkin memblokir sambil menunggu salah satu aliran, saat mencoba 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 tangkapan, 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