다음을 통해 공유


Xbox의 UWP 앱에 대한 4K 비디오 재생

이 항목에서는 Xbox의 UWP 앱에서 4K 비디오 콘텐츠 재생을 사용하도록 설정하고 구현하는 방법을 설명합니다. 이 정보는 지원되는 모든 4K 비디오 재생 형식에 적용됩니다. 그러나 현재 세대의 콘솔에서 4K 재생을 위한 기본 비디오 코덱은 HEVC(고효율 비디오 코딩)입니다.

HEVC를 사용하면 뛰어난 시각적 충실도를 지원하면서 향상된 압축 효율성과 감소된 대역폭 사용량으로 고품질 비디오를 제공할 수 있습니다. HEVC를 활용하여 미디어 앱은 더 낮은 비트 전송률 요구 사항으로 4K 콘텐츠를 스트리밍할 수 있습니다. 이렇게 하면 대역폭이 제한된 환경에서도 더 원활한 재생과 더 나은 사용자 환경이 보장됩니다. 이 항목에서는 Xbox에서 재생 성능을 구체화하기 위한 모범 사례와 함께 4K(HEVC 포함) 재생 플래그를 사용하도록 설정하는 데 필요한 단계를 다룹니다.

사용하도록 설정된 경우의 동작 차이점

애플리케이션에서 4K 재생을 사용하도록 설정하면 Xbox 운영 체제에서 애플리케이션을 처리하는 방식이 변경됩니다. Xbox Series S 및 Series X 콘솔에서는 4K 비디오 재생을 허용하는 것 외에도 애플리케이션에 추가로 3.25GB의 그래픽 메모리가 할당됩니다. 이 메모리는 시스템에서 UWP 애플리케이션에 할당하는 일반 메모리와는 별개입니다.

또한 응용 프로그램은 더 이상 Xbox 콘솔의 게임과 동시에 실행할 수 없습니다. 사용자가 게임을 시작하면 앱이 일시 중단되고 닫힙니다. 마찬가지로, 앱이 시작되면 사용자는 플레이 중이던 모든 게임이 완전히 닫히기를 기다려야 합니다. 그 결과 앱은 배경 음악을 재생할 수 있는 것과 4K 비디오 콘텐츠를 재생할 수 있는지 중에서 선택해야 합니다.

appxmanifest에서 4K 재생 사용

Xbox One S부터 4K 및 HDR10 비디오 재생이 지원됩니다(원래 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>

기능 검사

콘솔 형식을 사용하는 대신, HEVC/4K/HDCP 지원을 확인하기 위해 권장되는 UWP API는 ProtectionCapabilities.IsTypeSupported입니다.

다음은 몇 가지 간단한 예입니다.

  1. 하드웨어 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")
  1. 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")
  1. 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")
  1. HDCP 2.2 지원(속도가 느리기 때문에 4K 검사 후 이 작업을 수행하는 것이 좋습니다.)
IsTypeSupported (""video/mp4;codecs="hvc1,mp4a";features="hdcp=2"", "com.microsoft.playready.hardware")

이러한 쿼리는 원래 Xbox One에서 NotSupported 반환합니다. 즉, 하드웨어 HEVC 디코딩 지원이 없음을 의미합니다(소프트웨어 디코딩만 지원). Xbox One S 이상의 다른 모든 콘솔에서 첫 번째 쿼리는 항상 Probably반환하며, 나머지 쿼리는 연결된 디스플레이에 따라 Probably 반환합니다.

4K 애플리케이션에 대한 팁

메모리 사용량 정보

HEVC를 사용하도록 설정한 앱의 Xbox에서만 작동하는 보다 정확한 메모리 사용 정보를 검색하는 API도 있습니다. 다음 코드 예제는 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;
};

다음으로, 메모리 정보의 출력을 보는 데 사용할 수 있도록 MemoryInfo이라는 이름의 TextBlock을 기본 XAML 페이지에 추가합니다.

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

그런 다음 기본 XAML 페이지의 .cpp 파일에서 다음 함수를 추가합니다(페이지의 .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 Series S 및 Series X에 대한 그래픽 파티션 정보를 제공합니다.

디스플레이 모드 전환

재생을 시작하기 전에 앱은 표시/TV를 콘텐츠에 적합한 디스플레이 모드로 전환해야 합니다(형식/해상도/새로 고침 속도와 일치). Xbox에서 디스플레이 모드 열거 및 전환은 HdmiDisplayInformation처리됩니다.

  1. HdmiDisplayInformation.GetSupportedDisplayModes 사용하여 지원되는 디스플레이 모드 목록을 검색합니다.

  2. HDMIDisplayInformation.RequestSetCurrentDisplayModeAsync 및 HDMIDisplayInformation::RequestSetDisplayModeAsync를 사용하여 원하는 표시 모드를 설정합니다.

메모

필요한 경우 SDR 비디오 콘텐츠가 HDR10 디스플레이 모드로 재생됩니다(디스플레이 파이프는 기본 색 영역/eotf 변환을 수행합니다). SDR 디스플레이 모드에서 HDR10 비디오 콘텐츠 재생도 자동 톤 매핑이 적용되어 지원됩니다(미디어 파이프라인에서 수행됨).

그러나 재생이 완료되면 HdmiDisplayInformation.SetDefaultDisplayModeAsync사용하여 SDR(기본 표시 모드)으로 다시 전환하는 것이 좋습니다. HDR/Dolby Vision 디스플레이 모드에서 애플리케이션 UI가 정확하게 색 변환되지 않을 수 있으므로 색 문제(특히 텍스트 렌더링)를 확인할 수 있기 때문입니다.

자동 3:2 풀다운이 지원되므로 모든 미디어 재생에 항상 60Hz 모드를 사용하는 것이 좋습니다. 미디어 재생에는 120Hz 모드가 지원되지 않습니다.

다음은 사용자 지정 미디어 원본 또는 MSE를 사용하는 경우 몇 가지 권장 사항입니다(기본 제공 AdaptiveMediaSource를 사용하면 이러한 특성이 올바르게 설정됨).

  1. 미디어 유형을 설정할 때 MF_MT_DECODER_USE_MAX_RESOLUTION 특성을 TRUE 설정하는 것이 좋습니다. 이를 통해 원활/결함 없는 재생을 보장하고 메모리 사용량을 최적화할 수 있습니다.

  2. 같은 이유로 MF_MT_DECODER_MAX_DPB_COUNT 3으로 설정합니다.

참조