Aracılığıyla paylaş


Pencereli Modu Kullanma

[DirectShowbu sayfayla ilişkilendirilmiş özellik eski bir özelliktir. Yerine MediaPlayer, IMFMediaEngineve Media Foundation 'de Ses/Video Yakalamaalmıştır. Bu özellikler Windows 10 ve Windows 11 için iyileştirilmiştir. Microsoft, mümkün olduğunda yeni kodlarda MediaPlayer, IMFMediaEngine ve Medya Vakfı'ndaki Audio/Video Capture kullanılmasını ve DirectShowyerine bu araçların tercih edilmesini kesinlikle önerir. Microsoft, mümkünse yeni API'leri kullanmak için eski API'leri kullanan mevcut kodun yeniden yazılmasını önerir.]

Not

Eski Video oluşturucu filtresi her zaman pencereli modu kullanır. VMR-7 ve VMR-9 filtreleri varsayılan olarak pencereli modu kullanır, ancak penceresiz modu da destekler.

 

Pencereli modda, video işleyicisi video çerçevelerini boyadığı kendi penceresini oluşturur. Aksini belirtmediğiniz sürece, bu pencere kendi kenarlıklarına ve başlık çubuğuna sahip üst düzey bir penceredir. Ancak çoğu zaman video penceresini uygulama penceresine iliştirerek videonun uygulama kullanıcı arabiriminizle tümleştirilmesini sağlayacaksınız. Bu, aşağıdaki adımları gerektirir:

  1. IVideoWindowiçin sorgu.
  2. Üst pencereyi ayarlayın.
  3. Yeni pencere stilleri ayarlayın.
  4. Video penceresini sahip penceresinin içine yerleştirin.
  5. WM_MOVE mesajlarını video penceresine bildirin.

IVideoWindow için Sorgu

Kayıttan yürütmeye başlamadan önce Filter Graph Manager'dan IVideoWindow arabirimini sorgulayın:

IVideoWindow *pVidWin = NULL;
pGraph->QueryInterface(IID_IVideoWindow, (void **)&pVidWin);

Ana Pencereyi Ayarla

Üst pencereyi ayarlamak için IVideoWindow::put_Owner metodunu uygulama pencerenizin tanıtıcısıyla çağırın. Bu yöntem OAHWNDtüründe bir değişken alır, bu nedenle tutamacı şu türe dönüştür:

pVidWin->put_Owner((OAHWND)hwnd);

Yeni Pencere Stilleri Ayarla

IVideoWindow::p ut_WindowStyle yöntemini çağırarak video penceresinin stilini değiştirin:

pVidWin->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS);

WS_CHILD bayrağı pencereyi alt pencere olarak ayarlar ve WS_CLIPSIBLINGS bayrağı pencerenin başka bir alt pencerenin istemci alanı içine çizilmesine engel olur.

Video penceresini konumlandır

Videonun uygulama penceresinin istemci alanına göre konumunu ayarlamak için IVideoWindow::SetWindowPosition yöntemini çağırın. Bu yöntem, video penceresinin sol kenarını, üst kenarını, genişliğini ve yüksekliğini belirten bir dikdörtgen alır. Örneğin, aşağıdaki kod video penceresini üst pencerenin istemci alanının tamamına sığacak şekilde genişletir:

RECT rc;
GetClientRect(hwnd, &rc);
pVidWin->SetWindowPosition(0, 0, rc.right, rc.bottom);

Videonun yerel boyutunu almak için Filter Graph Manager'da IBasicVideo::GetVideoSizeyöntemini çağırın. Videoyu ölçeklendirmek ve doğru en boy oranını korumak için bu bilgileri kullanabilirsiniz.

WM_MOVE İletilerine Yanıt Verme

En iyi performans için, grafik duraklatıldığında pencere hareket ettiği her durumda video işleyiciye bildirmeniz gerekir. WM_MOVE iletisini iletmek için IVideoWindow::NotifyOwnerMessage yöntemini çağırın:

// (Inside your WindowProc)
case WM_MOVE:
    pVidWin->NotifyOwnerMessage((OAHWND)hWnd, msg, wParam, lParam);
    break;

İşleyici bir donanım katmanı kullanıyorsa, bu bildirim işleyicinin katman konumunu güncelleştirmesine neden olur. (VMR-9 katman kullanmaz, bu nedenle VMR-9 kullanıyorsanız bu yöntemi çağırmanız gerekmez.)

Temizleme

Uygulamadan çıkmadan önce grafiği durdurun ve video penceresinin sahibini NULL olarak sıfırlayın. Aksi takdirde, pencere iletileri yanlış pencereye gönderilebilir ve bu da hatalara neden olabilir. Ayrıca, video penceresini gizleyin, aksi halde ekranda anlık olarak titreyen bir video görüntüsü görebilirsiniz:

pControl->Stop(); 
pVidWin->put_Visible(OAFALSE);
pVidWin->put_Owner(NULL);  

Not

Video penceresinin üst öğesi ana uygulama pencerenizin alt öğesiyse (başka bir deyişle, video penceresi bir çocuğun çocuğuysa), CoCreateInstance kullanarak video penceresini oluşturup grafiğe eklemeniz gerekir. Bunun yerine, Filter Graph Manager'ın Akıllı Bağlantı sırasında video işleyicisini eklemesine izin vermemelisiniz. Bu, video penceresinin ve çocuk pencerenizin aynı anda yeniden boyanmasını sağlar. Aksi takdirde, alt pencere video penceresinin üzerine boyanabilir.

 

Video İşleme