Compartir a través de


Reproducción de vídeo 4K para aplicaciones para UWP en Xbox

En este tema se describe cómo habilitar e implementar contenido de codificación de vídeo de alta eficiencia 4K (HEVC) en tu aplicación para UWP en Xbox.

Con HEVC, puede ofrecer vídeo de alta calidad con una mayor eficiencia de compresión y un uso de ancho de banda reducido, al tiempo que admite una fidelidad visual superior. Al aprovechar HEVC, las aplicaciones multimedia pueden transmitir contenido 4K con requisitos de velocidad de bits más bajos. Esto garantizará una reproducción más fluida y una mejor experiencia de usuario, incluso en entornos restringidos por ancho de banda. En este tema tratamos los pasos necesarios para habilitar la marca de reproducción HEVC, junto con los procedimientos recomendados para refinar el rendimiento de reproducción en Xbox.

Diferencias de comportamiento cuando está habilitada

Habilitar la reproducción de 4K HEVC en la aplicación cambia la forma en que el sistema operativo Xbox trata la aplicación. En las consolas Xbox Series S y Series X, además de permitir la reproducción de vídeo 4K, la aplicación se asignará un adicional de 3,25 GB de memoria gráfica. Esta memoria es independiente de la memoria normal que el sistema asigna a las aplicaciones para UWP.

Además, la aplicación ya no podrá ejecutarse simultáneamente con juegos en la consola Xbox, cuando el usuario inicie un juego, la aplicación se suspenderá y cerrará. Del mismo modo, cuando se inicie la aplicación, el usuario tendrá que esperar a que cualquier juego que estuviera jugando se cierre completamente. Una consecuencia de esto es que las aplicaciones tendrán que elegir entre poder reproducir música de fondo y poder reproducir contenido de vídeo 4K.

Habilitación de la reproducción 4K en appxmanifest

La reproducción de vídeo 4K y HDR10 es compatible con Xbox One S en adelante (la Xbox One original está restringida a 1080p). Todas estas funcionalidades se habilitan mediante la funcionalidad especial hevcPlayback en el manifiesto de la aplicación. El códec de vídeo preferido para la reproducción 4K es HEVC para la generación actual de consolas.

Ejemplo de código

<Package
  xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
  xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest"
  xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
  xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
  IgnorableNamespaces="uap mp rescap">

...

  <Capabilities>
    <Capability Name="internetClient" />
    <rescap:Capability Name="hevcPlayback" />
  </Capabilities>
</Package>

Comprobaciones de funcionalidad

En lugar de ir por tipo de consola, la API de UWP recomendada para determinar la compatibilidad con HEVC/4K/HDCP es ProtectionCapabilities.IsTypeSupported.

Estos son algunos ejemplos breves.

  1. Compatibilidad con descodificación de HEVC de hardware
IsTypeSupported(""video/mp4;codecs="hvc1,mp4a";features="decode-res-x=3840,decode-res-y=2160,decode-bitrate=20000,decode-fps=30,decode-bpc=10"", "com.microsoft.playready.hardware")
  1. Compatibilidad con la descodificación y visualización de HEVC 4K
IsTypeSupported(""video/mp4;codecs="hvc1,mp4a";features="decode-res-x=3840,decode-res-y=2160,decode-bitrate=20000,decode-fps=30,decode-bpc=10,display-res-x=3840,display-res-y=2160,display-bpc=8"", "com.microsoft.playready.hardware")
  1. Compatibilidad con la descodificación y visualización de HEVC 4K y con HDR
IsTypeSupported(""video/mp4;codecs="hvc1,mp4a";features="decode-res-x=3840,decode-res-y=2160,decode-bitrate=20000,decode-fps=30,decode-bpc=10,display-res-x=3840,display-res-y=2160,display-bpc=10, hdr=1"", "com.microsoft.playready.hardware")
  1. Compatibilidad con HDCP 2.2 (se recomienda hacerlo después de las comprobaciones de 4K porque es lenta)
IsTypeSupported (""video/mp4;codecs="hvc1,mp4a";features="hdcp=2"", "com.microsoft.playready.hardware")

Esas consultas devolverán NotSupported en la Xbox One original, lo que significa que no hay compatibilidad con descodificación HEVC de hardware (solo admite descodificación de software). En todas las demás consolas, Xbox One S y versiones posteriores, la primera consulta siempre devolverá Probablyy las consultas restantes devolverán Probably en función de la pantalla conectada.

Sugerencias para aplicaciones 4K

Información de uso de memoria

También hay una API para recuperar información de uso de memoria más precisa que solo funciona en Xbox para aplicaciones que tienen HEVC habilitado. El ejemplo de código siguiente está en C++. Para usarlo, agregue al proyecto un nuevo archivo de encabezado denominado IApplicationStatics2.hy pegue la siguiente lista de código en él.

#pragma once

#include "Windows.Foundation.h"
#include "Inspectable.h"
#include <cstdint>

typedef struct ExtendedMemoryInfo
{
    uint64_t appMemoryUsage;
    uint64_t appMemoryLimit;
    uint64_t extendedMemoryUsage;
    uint64_t extendedMemoryLimit;
} ExtendedMemoryInfo;

interface __declspec(uuid("dd36a017-b640-45f7-a023-1615cf098923"))
    IApplicationResourcesStatics2 : ::IInspectable
{
    virtual HRESULT GetExtendedMemoryInfo(ExtendedMemoryInfo* memoryInfo) = 0;
};

A continuación, agregue a la página XAML principal una TextBlock denominada MemoryInfo, que puedes usar para ver la salida de la información de memoria.

<Canvas Width="500"
        HorizontalAlignment="Right"
        VerticalAlignment="Top"
        ZIndex="1">
    <TextBlock x:Name="MemoryInfo"
               Foreground="#88FFFFFF"
               FontSize="30" />
</Canvas>

A continuación, en el archivo .cpp de la página XAML principal, agregue la siguiente función (también la declara en el archivo .h de la página).

#include "IApplicationResourcesStatics2.h"
 
// ...
 
fire_and_forget MainPage::PeriodicMemoryQuery()
{
    co_await resume_background();
 
    auto factoryInspectable =
        winrt::get_activation_factory<IInspectable>(L"Windows.Xbox.ApplicationModel.ApplicationResources").as<::IInspectable>();
    winrt::com_ptr<IApplicationResourcesStatics2> appResources;
    factoryInspectable->QueryInterface(IID_PPV_ARGS(&appResources));
    ExtendedMemoryInfo memInfo;
 
    while (true)
    {
        // Check memory every 3s, and post to the UI thread to display.
        Sleep(3000);
 
        appResources->GetExtendedMemoryInfo(&memInfo);
        Dispatcher().RunAsync(Windows::UI::Core::CoreDispatcherPriority::Low, [memInfo, this]() {
            std::wstring memPayload = L"AppUsage: ";
            memPayload += winrt::to_hstring(static_cast<uint64_t>(memInfo.appMemoryUsage / 1024.0f / 1024.0f)).c_str();
            memPayload += L"MB\nExtendedUsage: ";
            memPayload += winrt::to_hstring(static_cast<uint64_t>(memInfo.extendedMemoryUsage / 1024.0f / 1024.0f)).c_str();
            memPayload += L"MB\nTotal: ";
            memPayload += winrt::to_hstring(static_cast<uint64_t>((memInfo.appMemoryUsage + memInfo.extendedMemoryUsage) / 1024.0f / 1024.0f)).c_str();
            memPayload += L"MB";
            MemoryInfo().Text(memPayload.c_str());
            });
    }
}

Llame a esa función desde el constructor de su página para que MemoryInfo se actualice periódicamente.

Las propiedades de appMemory hacen referencia al uso general del montón. Las propiedades extendedMemory proporcionan información de partición de gráficos en Xbox Series S y Series X.

Cambiar los modos de visualización

Antes de iniciar la reproducción, la aplicación debe cambiar la pantalla o el televisor al modo de pantalla adecuado para el contenido (para que coincida con el tipo, la resolución o la frecuencia de actualización). Los modos de visualización de enumeración y conmutación en la Xbox son manejados por HdmiDisplayInformation.

  1. Use HdmiDisplayInformation.GetSupportedDisplayModes para recuperar una lista de los modos de visualización admitidos.

  2. Use HdmiDisplayInformation.RequestSetCurrentDisplayModeAsync HDMIDisplayInformation::RequestSetDisplayModeAsync para establecer el modo de visualización deseado.

Nota

El contenido de vídeo SDR se reproducirá en modos de visualización HDR10 si es necesario (la canalización de visualización realizará conversiones básicas de espacios de colores/eotf). La reproducción de contenido de vídeo HDR10 en modos de visualización SDR también se admite con la asignación tonal automática aplicado (esto se realiza en la canalización de medios).

Sin embargo, se recomienda que una vez completada la reproducción, vuelva al modo de visualización predeterminado (SDR) mediante HdmiDisplayInformation.SetDefaultDisplayModeAsync. Esto se debe a que es posible que la interfaz de usuario de la aplicación no se convierta con precisión en los modos de pantalla HDR/Dolby Vision, por lo que es posible que observe problemas de color (particularmente en la representación del texto).

Se admite la extracción automática de 3:2, por lo que está bien usar siempre los modos de 60Hz para toda la reproducción multimedia. Los modos de 120Hz no se admiten para la reproducción multimedia.

Estas son algunas recomendaciones al usar un origen multimedia personalizado o MSE (el uso de AdaptiveMediaSource integrado establecerá estos atributos correctamente).

  1. Se recomienda encarecidamente establecer el atributo MF_MT_DECODER_USE_MAX_RESOLUTION en TRUE al establecer el tipo de medio. Esto garantizará una reproducción sin interrupciones y optimizará el uso de memoria.

  2. Por el mismo motivo, establezca MF_MT_DECODER_MAX_DPB_COUNT en 3.

Consulte también