Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этом разделе описывается, как включить и реализовать воспроизведение видеосвязи 4K в приложении UWP на Xbox. Сведения применяются к любому поддерживаемому формату воспроизведения видео 4K. Но для текущего поколения консолей предпочтительный видеокодек для воспроизведения 4K — это высокопроизводительное видеокодирование (HEVC).
С помощью HEVC вы можете предоставлять высококачественное видео с улучшенной эффективностью сжатия и сокращением использования пропускной способности при поддержке высокой визуальной точности. Используя HEVC, приложения мультимедиа могут передавать содержимое 4K с более низким уровнем скорости. Это обеспечит более плавное воспроизведение и лучшее взаимодействие с пользователем, даже в средах с ограниченными пропускной способностью. В этом разделе мы рассмотрим необходимые действия для включения флага воспроизведения 4K (включая HEVC), а также рекомендации по улучшению производительности воспроизведения на Xbox.
Различия в поведении при включении
Включение воспроизведения 4K в приложении изменяет способ обработки приложения операционной системой Xbox. В консоли Xbox Серии S и Серии X, помимо воспроизведения видео 4K, ваше приложение будет выделено дополнительно 3,25 ГБ графической памяти. Эта память отличается от обычной памяти, выделенной системой для приложений UWP.
Кроме того, приложение больше не сможет работать одновременно с играми на консоли Xbox— когда пользователь запускает игру, ваше приложение будет приостановлено и закрыто. Аналогичным образом, при запуске вашего приложения пользователю придется подождать, пока игра, в которую он играл, полностью закроется. Следствием этого является то, что приложениям потребуется выбрать способ воспроизведения фоновой музыки и воспроизведения видеоконтента 4K.
Включение воспроизведения 4K в appxmanifest
Воспроизведение видео 4K и HDR10 поддерживается на Xbox One S и новее (исходный Xbox One ограничен 1080p). Все эти возможности включены с помощью специальной возможности hevcPlayback
в манифесте приложения. Опять же, флаг включает воспроизведение видео 4K в любом поддерживаемом формате (но рекомендуется HEVC).
Пример кода
<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>
Проверки возможностей
Вместо того чтобы использовать тип консоли, рекомендуется использовать API UWP ProtectionCapabilities.IsTypeSupported для определения поддержки HEVC/4K/HDCP.
Ниже приведены некоторые краткие примеры.
- Поддержка аппаратного декодирования HEVC
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")
- Поддержка декодирования и отображения 4K HEVC
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")
- Поддержка декодирования и отображения 4K HEVC/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")
- Поддержка HDCP 2.2 (мы рекомендуем сделать это после проверки 4K, так как это медленно)
IsTypeSupported (""video/mp4;codecs="hvc1,mp4a";features="hdcp=2"", "com.microsoft.playready.hardware")
Эти запросы возвращают NotSupported
на исходном Xbox One, что означает, что не поддерживается аппаратное декодирование HEVC (оно поддерживает только декодирование программного обеспечения). Во всех остальных консоли — Xbox One S и более поздних версиях первый запрос всегда возвращает Probably
, а остальные запросы возвращаются Probably
в зависимости от подключенного дисплея.
Советы по приложениям 4K
Сведения об использовании памяти
Существует также API для получения более точных сведений об использовании памяти, которые работают только в Xbox для приложений с включенным HEVC. В следующем примере кода используется C++. Чтобы использовать его, добавьте в проект новый файл заголовка с именем IApplicationStatics2.h
и вставьте в него следующий список кода.
#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;
};
Затем добавьте на главную страницу XAML TextBlock с именем MemoryInfo
, которую можно использовать для просмотра выходных данных о памяти.
<Canvas Width="500"
HorizontalAlignment="Right"
VerticalAlignment="Top"
ZIndex="1">
<TextBlock x:Name="MemoryInfo"
Foreground="#88FFFFFF"
FontSize="30" />
</Canvas>
Затем в файле .cpp
для главной страницы XAML добавьте следующую функцию (также объявите ее в файле .h
страницы).
#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());
});
}
}
Вызовите эту функцию из конструктора вашей страницы, чтобы она обновляла MemoryInfo
периодически.
Свойства appMemory
относятся к общему использованию кучи. Свойства extendedMemory
предоставляют сведения о секции графики в Серии Xbox S и Серии X.
Переключение режимов отображения
Перед началом воспроизведения приложение должно переключить экран или телевизор в соответствующий режим отображения содержимого (чтобы соответствовать типу, разрешению или частоте обновления). Переключение и перечисление режимов отображения на Xbox осуществляется с помощью HdmiDisplayInformation.
Используйте HdmiDisplayInformation.GetSupportedDisplayModes для получения списка поддерживаемых режимов отображения.
Используйте HdmiDisplayInformation.RequestSetCurrentDisplayModeAsync HDMIDisplayInformation::RequestSetDisplayModeAsync, чтобы задать нужный режим отображения.
Заметка
Видеоконтент SDR будет воспроизводиться в режимах отображения HDR10 при необходимости (канал отображения будет выполнять базовые преобразования цветового пространства или eotf). Воспроизведение видеоконтента HDR10 в режимах отображения SDR также поддерживается с применением автоматического сопоставления тонов (это делается в конвейере мультимедиа).
Однако рекомендуется после завершения воспроизведения вернуться к режиму отображения по умолчанию (SDR) с помощью HdmiDisplayInformation.SetDefaultDisplayModeAsync. Это связано с тем, что пользовательский интерфейс приложения не может быть точно преобразован в режимы отображения hdR/Dolby Vision, поэтому вы можете заметить проблемы с цветом (отрисовка текста в частности).
Поддерживается автоматическое вытягивание 3:2, поэтому для воспроизведения мультимедиа всегда рекомендуется использовать режимы 60Гц. Режимы 120Гц не поддерживаются для воспроизведения мультимедиа.
Ниже приведены некоторые рекомендации при использовании пользовательского источника мультимедиа или MSE (при использовании встроенного AdaptiveMediaSource для правильной настройки этих атрибутов).
Мы настоятельно рекомендуем установить атрибут MF_MT_DECODER_USE_MAX_RESOLUTION в значение TRUE при установке типа носителя. Это обеспечит плавное или без сбоев воспроизведение и оптимизирует использование памяти.
По той же причине задайте для параметра MF_MT_DECODER_MAX_DPB_COUNT значение 3.