Compartir a través de


Mostrar un mapa de bits proporcionado por la aplicación en la imagen compuesta

[La característica asociada a esta página, DirectShow, es una característica heredada. Se ha reemplazado por MediaPlayer, IMFMediaEngine y Captura de audio/vídeo en Media Foundation. Esas características se han optimizado para Windows 10 y Windows 11. Microsoft recomienda encarecidamente que el nuevo código use MediaPlayer, IMFMediaEngine y Audio/Video Capture en Media Foundation en lugar de DirectShow, siempre que sea posible. Microsoft sugiere que el código existente que usa las API heredadas se reescriba para usar las nuevas API si es posible.

Las aplicaciones pueden usar el modo de mezcla de VMR para mostrar logotipos de canales mezclados alfa, una interfaz de usuario o anuncios parcial o completamente dentro del rectángulo de vídeo. Dado que el procesador de gráficos realiza la mezcla en hardware, el rendimiento de reproducción de la secuencia de vídeo no afecta al rendimiento de la reproducción y no hay artefactos de parpadeo o desgarramiento detectables. Las aplicaciones pueden cambiar la imagen que se muestra con la frecuencia que desee. Debe tenerse en cuenta que los cambios solo se reflejan en la pantalla cuando el gráfico de filtro DirectShow está en estado de ejecución.

VmR usa su componente mezclador para superponer el mapa de bits a la imagen compuesta. Con VMR-7, la aplicación debe forzar a VMR a cargar su mezclador, incluso si solo hay una sola secuencia de vídeo. Esto no es necesario con VMR-9, ya que carga su mezclador de forma predeterminada.

Para combinar una imagen de mapa de bits estática con la secuencia de vídeo, la aplicación crea el VMR y lo agrega al gráfico y, a continuación, llama a IVMRFilterConfig::SetNumberOfStreams. El valor pasado a esta función identifica el número de patillas de entrada que debe crear el VMR. Las aplicaciones pueden especificar cualquier valor entre 1 y MAX_MIXER_STREAMS; especificar un valor de 1 es válido si la aplicación solo pretende mostrar una sola secuencia de vídeo. Aunque VMR-7 tiene una sola patilla de entrada de forma predeterminada, se debe llamar a este método para obligarlo a cargar su componente mezclador. (VmR-9 carga su mezclador y configura cuatro patillas de forma predeterminada).

Para establecer el mapa de bits, use la interfaz IVMRMixerBitmap en VMR-7 o la interfaz IVMRMixerBitmap9 en VMR-9.

El mapa de bits se puede especificar mediante un identificador para un contexto de dispositivo GDI (hDC) o mediante una interfaz surface de DirectDraw. Si la aplicación quiere que la imagen contenga información alfa incrustada (también conocida como por píxel alfa), debe colocar los datos de imagen en una interfaz de DirectDraw Surface. Esto se debe a que actualmente no es posible colocar información alfa por píxel con un contexto de dispositivo GDI. La superficie directDraw debe ser RGB32 o ARGB32, y preferiblemente debe ser una superficie de memoria del sistema. No es necesario que las dimensiones de superficie sean una potencia de 2.

VmR permite a las aplicaciones especificar la ubicación y un valor de transparencia general para la imagen. En el código siguiente se muestra cómo pasar datos de imagen a VMR para la combinación posterior:

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;
}

Los conceptos descritos en este tema se muestran en la aplicación de ejemplo de ejemplo VMRPlayer .

Crear animaciones simples con la imagen de mapa de bits

Para crear un logotipo de mapa de bits animado simple, coloque todos los "fotogramas" de mapa de bits en una sola imagen, como se muestra en la ilustración siguiente.

Franja de imágenes de vmr

Al establecer el mapa de bits inicialmente mediante IVMRMixerBitmap::SetAlphaBitmap, si el mapa de bits está en un HDC, establezca el campo rSrc de la estructura VMRALPHABITMAP para especificar el tamaño de todo el mapa de bits dentro de HDC. Los miembros superior e izquierdo de la estructura se establecen en 0 y los miembros derecho e inferior son el ancho y alto del mapa de bits. Si el mapa de bits está en una superficie de DirectDraw, se conoce el tamaño de la superficie, por lo que no es necesario especificar rSrc en este método.

Al llamar a IVMRMixerBitmap::UpdateAlphaBitmapParameters, use el miembro rSrc para los mapas de bits de HDC y DirectDraw, para especificar el marco o rectángulo determinado dentro de la imagen que desea mostrar y establezca la marca de VMRBITMAP_SRCRECT en el miembro dwFlags .

Uso del modo de combinación de VMR