Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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.
- 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")
- 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")
- 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")
- 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á Probably
y 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.h
y 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.
Use HdmiDisplayInformation.GetSupportedDisplayModes para recuperar una lista de los modos de visualización admitidos.
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).
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.
Por el mismo motivo, establezca MF_MT_DECODER_MAX_DPB_COUNT en 3.