Bagikan melalui


Menampilkan bitmap yang disediakan aplikasi pada gambar yang dikomposisikan

[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.]

Aplikasi dapat menggunakan mode pencampuran VMR untuk menampilkan logo saluran alpha-blended, antarmuka pengguna, atau iklan baik sebagian atau sepenuhnya dalam persegi panjang video. Karena perpaduan dilakukan dalam perangkat keras oleh prosesor grafis, ada dampak minimal terhadap performa pemutaran Video Stream, dan tidak ada kedipan yang dapat dideteksi atau merobek artefak. Aplikasi dapat mengubah gambar yang ditampilkan sesering yang mereka inginkan. Perlu dicatat bahwa perubahan hanya tercermin pada layar ketika grafik filter DirectShow berada dalam status berjalan.

VMR menggunakan komponen mixernya untuk melapisi bitmap ke gambar yang dikomposisikan. Dengan VMR-7, aplikasi harus memaksa VMR memuat mixernya, bahkan jika hanya ada satu aliran video. Ini tidak diperlukan dengan VMR-9 karena memuat mixer-nya secara default.

Untuk memadukan gambar bitmap statis dengan aliran video, aplikasi membuat VMR dan menambahkannya ke grafik, lalu memanggil IVMRFilterConfig::SetNumberOfStreams. Nilai yang diteruskan ke fungsi ini mengidentifikasi jumlah pin input yang harus dibuat VMR. Aplikasi dapat menentukan nilai apa pun antara 1 dan MAX_MIXER_STREAMS; menentukan nilai 1 valid jika aplikasi hanya berniat menampilkan satu aliran video. Meskipun VMR-7 memiliki pin input tunggal secara default, metode ini harus dipanggil untuk memaksanya memuat komponen mixernya. (VMR-9 memuat mixer-nya dan menyiapkan empat pin secara default.)

Untuk mengatur bitmap, gunakan antarmuka IVMRMixerBitmap pada VMR-7 atau antarmuka IVMRMixerBitmap9 pada VMR-9.

Bitmap dapat ditentukan dengan handel ke Konteks Perangkat GDI (hDC) atau oleh antarmuka Permukaan DirectDraw. Jika aplikasi ingin gambar berisi informasi alfa yang disematkan (juga dikenal sebagai per alpha piksel), aplikasi harus menempatkan data gambar dalam antarmuka DirectDraw Surface. Ini karena saat ini tidak dimungkinkan untuk menempatkan informasi alfa per piksel dengan Konteks Perangkat GDI. Permukaan DirectDraw harus RGB32 atau ARGB32, dan sebaiknya menjadi permukaan memori sistem. Tidak perlu dimensi permukaan menjadi kekuatan 2.

VMR memungkinkan aplikasi untuk menentukan lokasi dan nilai transparansi keseluruhan untuk gambar. Kode berikut menunjukkan cara meneruskan data gambar ke VMR untuk pencampuran berikutnya:

HRESULT BlendApplicationImage( 
  HWND hwndApp,
  IVMRWindowlessControl* pWc,
  HBITMAP hbm
)
{
    LONG cx, cy;
    HRESULT hr;
    hr = pWc->GetNativeVideoSize(&cx, &cy, NULL, NULL);
    if (FAILED(hr))
        return hr;
    
    HDC hdc = GetDC(hwndApp);
    if (hdc == NULL)
    {
        return E_FAIL;
    }
    
    HDC hdcBmp = CreateCompatibleDC(hdc);
    ReleaseDC(hwndApp, hdc);
    
    if (hdcBmp == NULL)
    {
        return E_FAIL;
    }
    
    BITMAP bm;
    if (0 == GetObject(hbm, sizeof(bm), &bm))
    {
        DeleteDC(hdcBmp);
        return E_FAIL;
    }
    
    HBITMAP hbmOld = (HBITMAP)SelectObject(hdcBmp, hbm);
    if (hbmOld == 0)
    {
        DeleteDC(hdcBmp);
        return E_FAIL;
    }
    
    VMRALPHABITMAP bmpInfo;
    ZeroMemory(&bmpInfo, sizeof(bmpInfo) );
    bmpInfo.dwFlags = VMRBITMAP_HDC;
    bmpInfo.hdc = hdcBmp;
    
    // Show the entire bitmap in the top-left corner of the video image.
    SetRect(&bmpInfo.rSrc, 0, 0, bm.bmWidth, bm.bmHeight);
    bmpInfo.rDest.left = 0.f;
    bmpInfo.rDest.top = 0.f;
    bmpInfo.rDest.right = (float)bm.bmWidth / (float)cx;
    bmpInfo.rDest.bottom = (float)bm.bmHeight / (float)cy;
    
    // Set the transparency value (1.0 is opaque, 0.0 is transparent).
    bmpInfo.fAlpha = 0.2f;
    
    IVMRMixerBitmap* pBmp;
    hr = pWc->QueryInterface(IID_IVMRMixerBitmap, (LPVOID *)&pBmp);
    if (SUCCEEDED(hr)) 
    {
        pBmp->SetAlphaBitmap(&bmpInfo);
        pBmp->Release();
    }
    
    DeleteObject(SelectObject(hdcBmp, hbmOld));
    DeleteDC(hdcBmp);
    return hr;
}

Konsep yang dibahas dalam topik ini ditunjukkan dalam aplikasi sampel Sampel VMRPlayer .

Membuat Animasi Sederhana dengan Gambar Bitmap

Untuk membuat logo bitmap animasi sederhana, masukkan semua "bingkai" bitmap ke dalam satu gambar, seperti yang ditunjukkan dalam ilustrasi berikut.

strip gambar vmr

Ketika Anda mengatur bitmap awalnya menggunakan IVMRMixerBitmap::SetAlphaBitmap, jika bitmap berada dalam HDC, atur bidang rSrc dari struktur VMRALPHABITMAP untuk menentukan ukuran seluruh bitmap dalam HDC. Anggota atas dan kiri struktur diatur ke 0, dan anggota kanan dan bawah adalah lebar dan tinggi bitmap. Jika bitmap berada di permukaan DirectDraw, maka ukuran permukaan diketahui, sehingga tidak perlu menentukan rSrc dalam metode ini.

Saat Anda memanggil IVMRMixerBitmap::UpdateAlphaBitmapParameters, gunakan anggota rSrc untuk bitmap HDC dan DirectDraw, untuk menentukan bingkai atau persegi panjang tertentu dalam gambar yang ingin Anda tampilkan, dan atur bendera VMRBITMAP_SRCRECT di anggota dwFlags .

Menggunakan Mode Pencampuran VMR