エンコーダー / デコーダーの指定

ここでは Sora Unity SDK におけるビデオエンコーダー / デコーダーの指定方法と、 ハードウェアアクセラレーションを優先的に利用する手順を説明します。

Sora Unity SDK では、利用環境に合わせてエンコーダーとデコーダーを指定することができます。 また、ハードウェアアクセラレーションを優先的に設定する機能も用意しています。

この機能を利用することで、ハードウェアアクセラレーションを利用したエンコードやデコードを行うことができます。 ハードウェアアクセラレーションを利用することで、CPU の負荷を軽減し、より高品質な映像を提供することができます。 また、H.264 や H.265 などのコーデックを利用することができます。

指定可能なエンコーダーおよびデコーダー

Internal

ソフトウェアエンコーダーおよびデコーダーを利用します。

また、libwebrtc で提供されているエンコーダーおよびデコーダーを利用します。

この中には macOS と iOS の場合、Apple の VideoToolbox を利用したハードウェアエンコーダーおよびデコーダーも含まれています。

また、Android の場合、Android の MediaCodec を利用したハードウェアエンコーダーおよびデコーダーも含まれています。

それ以外のプラットフォームでは、ソフトウェアエンコーダーおよびデコーダーを利用します。

Intel VPL

Intel VPL は Intel 組込 GPU や Intel Arc で利用できるハードウェアアクセラレーターです。

Linux と Windows で利用でき、対応コーデックは VP9 / AV1 / H.264 / H.265 です。

VP9 はデコーダーのみ利用できます。

AMD AMF

AMD AMF は AMD 組込 GPU や AMD のビデオカードで利用できるハードウェアアクセラレーターです。

Linux と Windows で利用でき、対応コーデックは VP9 / AV1 / H.264 / H.265 です。

AV1 デコーダーは Windows x86_64 でのみ利用できます。

NVIDIA Video Codec SDK

NVIDIA Video Codec SDK は NVIDIA のビデオカードで利用できるハードウェアアクセラレーターです。

Linux と Windows で利用できます。対応コーデックは VP8 / VP9 / AV1 / H.264 / H.265 です。

VP8 と VP9 はデコーダーのみ利用できます。

エンコーダーデコーダーの指定に関連するクラスと関数

Sora.VideoCodecImplementation

Sora.VideoCodecImplementation は、利用するエンコーダーおよびデコーダーの実装を指定するための列挙型です。 以下の値が指定可能です。

  • Internal : ソフトウェアまたは libwebrtc で提供されているエンコーダーおよびデコーダーを利用します

  • IntelVPL : Intel VPL を利用します

  • NvidiaVideoCodecSdk : NVIDIA Video Codec SDK を利用します

  • AmdAmf : AMD AMF を利用します

Sora.VideoCodecPreference

Sora.VideoCodecPreference は、利用するエンコーダーおよびデコーダーの指定を行うためのクラスです。 このクラスを使用することで、特定のハードウェアアクセラレーションを利用する設定を行うことができます。 設定は、コーデック毎に指定することが可能です。また、エンコーダーおよびデコーダー個別に指定することもできます。

Sora.GetVideoCodecCapability()

Sora.GetVideoCodecCapability() は、現在の環境で利用可能なエンコーダーおよびデコーダーの対応状況を取得するための関数です。 この関数を使用して、利用可能なコーデックやハードウェアアクセラレーションの情報を取得できます。

取得された情報は Sora.VideoCodecPreference.CreateFromImplementation()GetHardwareAcceleratorPreference() の入力として使用します。

Sora.VideoCodecPreference.CreateFromImplementation()

Sora.VideoCodecPreference.CreateFromImplementation() は、指定されたエンコーダーおよびデコーダーの実装に基づいて、指定された Sora.VideoCodecImplementation のみを利用する Sora.VideoCodecPreference を作成します。

Sora.VideoCodecPreference.GetHardwareAcceleratorPreference()

Sora.VideoCodecPreference.GetHardwareAcceleratorPreference() は、取得した対応状況に基づき、ハードウェアアクセラレーションを優先する設定を生成するためのメソッドです。 このメソッドを使用することで、ハードウェアエンコーダーが利用可能な場合に自動的に優先設定を適用できます。利用不可能な場合はソフトウェアエンコーダー (Internal) の設定を試みます。

利用方法

エンコーダーとデコーダーの利用方法は 3 種類あります。

  1. エンコーダーとデコーダーを指定する

  2. 利用可能なハードウェアアクセラレーションを自動優先する

  3. エンコーダー / デコーダーを個別に (異なる実装で) 指定する

1. エンコーダーとデコーダーを指定する

// Sora インスタンスの宣言
Sora sora;
// Sora.Config インスタンスの生成
var config = new Sora.Config();

// Inspector で選択可能にしておき、デフォルトは Internal
public Sora.VideoCodecImplementation videoCodecImplementation = Sora.VideoCodecImplementation.Internal;

// ボタン押下で接続開始する例
public void OnClickStart()
{
    // 1. 利用可能なエンコーダーとデコーダーの一覧を取得
    var capability = Sora.GetVideoCodecCapability(new Sora.VideoCodecCapabilityConfig());
    var availableEngines = capability.Engines.Where(e => e.Name == videoCodecImplementation);

    // 2. 指定したエンコーダーとデコーダーが利用可能か確認
    if (!availableEngines.Any())
    {
        Debug.LogError($"指定された実装 {videoCodecImplementation} が利用できません。接続を中止します。");
        return;
    }
    // 3. Preference を生成
    var preference = Sora.VideoCodecPreference.CreateFromImplementation(capability, videoCodecImplementation);

    // 4. Config を構築して接続開始
    var config = new Sora.Config
    {
        VideoCodecPreference = preference,
    };
}

2. 利用可能なハードウェアアクセラレーションを自動優先する

こちらは Sora Unity SDK Samples にも含まれておりますので、そちらも参考にしてみてください。

Sora Unity SDK サンプル集

// Sora インスタンスの宣言
Sora sora;
// Sora.Config インスタンスの生成
var config = new Sora.Config();

// ボタン押下で接続開始する例
public void OnClickStart()
{
    // ハードウェアエンコーダーが使える場合は自動で優先 (利用不可なら自動的に Internal 等へフォールバック)

    // 1. 対応状況を取得
    var capability = Sora.GetVideoCodecCapability(new Sora.VideoCodecCapabilityConfig());

    // 2. ハードウェア優先の Preference を生成
    var preference = Sora.VideoCodecPreference.GetHardwareAcceleratorPreference(capability);

    // 3. Config に設定 (利用可能な HW が無い場合は Internal が選択される)
    var config = new Sora.Config
    {
        VideoCodecPreference = preference,
    };
}

3. エンコーダー / デコーダーを個別 (異なる実装) に指定する

エンコーダーとデコーダーを異なるハードウェアアクセラレーターで個別に指定することができます。 ここでは、H.264 のエンコードを NVIDIA Video Codec SDK、デコードを AMD AMF で行う例を示します。

// Sora インスタンスの宣言
Sora sora;
// Sora.Config インスタンスの生成
var config = new Sora.Config();

// ボタン押下で接続開始する例
public void OnClickStart()
{
    var capability = Sora.GetVideoCodecCapability(new Sora.VideoCodecCapabilityConfig());

    // H.264: エンコードを NVIDIA, デコードを AMD AMF に分離
    // Parameters はコーデック固有パラメータ(JSON)。空の場合 "{}" を渡す。
    var preference = new Sora.VideoCodecPreference
    {
        Codecs = new Sora.VideoCodecPreference.Codec[]
        {
            new Sora.VideoCodecPreference.Codec
            {
                Type = Sora.VideoCodecType.H264,
                Encoder = Sora.VideoCodecImplementation.NvidiaVideoCodecSdk,
                Decoder = Sora.VideoCodecImplementation.AmdAmf,
                Parameters = "{}",
            }
        }
    };

    // 指定したエンコーダーとデコーダーが利用可能かチェックする
    var availableEngines = capability.Engines.Where(e =>
        e.Name == Sora.VideoCodecImplementation.NvidiaVideoCodecSdk ||
        e.Name == Sora.VideoCodecImplementation.AmdAmf);

    if (!availableEngines.Any())
    {
        Debug.LogError("[VideoCodec] 指定したエンコーダーとデコーダーが利用できません。接続を中止します。");
        return;
    }

    // config に設定
    var config = new Sora.Config()
    {
        VideoCodecPreference = preference,
    };
}
© Copyright 2024, Shiguredo Inc. Created using Sphinx 8.2.3