次の方法で共有


Xbox での UWP アプリの 4K ビデオ再生

このトピックでは、Xbox 上の UWP アプリで 4K ビデオ コンテンツの再生を有効にして実装する方法について説明します。 この情報は、サポートされている 4K ビデオ再生形式に適用されます。 しかし、現在の世代のコンソールでは、4K 再生に推奨されるビデオ コーデックは、高効率ビデオ コーディング (HEVC) です。

HEVC を使用すると、優れた視覚的忠実性をサポートしながら、圧縮効率を向上させ、帯域幅の使用量を削減した高品質のビデオを提供できます。 メディア アプリでは、HEVC を利用することで、ビットレート要件が低い 4K コンテンツをストリーミングできます。 これにより、帯域幅が制限された環境でも、スムーズな再生と優れたユーザー エクスペリエンスが確保されます。 このトピックでは、4K (HEVC を含む) 再生フラグを有効にするために必要な手順と、Xbox での再生パフォーマンスを調整するためのベスト プラクティスについて説明します。

有効な場合の動作の違い

アプリケーションで 4K 再生を有効にすると、Xbox オペレーティング システムによるアプリケーションの処理方法が変わります。 Xbox シリーズ S およびシリーズ X 本体では、4K ビデオの再生を許可するだけでなく、アプリケーションには 3.25 GB のグラフィックス メモリが追加で割り当てられます。 このメモリは、システムが 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 が有効になっているアプリの場合にのみ動作する、より正確なメモリ使用量情報を取得する 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 をメイン 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 のグラフィックス パーティション情報を提供します。

表示モードの切り替え

再生を開始する前に、アプリでコンテンツの表示/テレビを適切な表示モードに切り替える必要があります (種類、解像度、リフレッシュ レートに合わせて)。 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 に設定します。

関連項目