エンコーダー / デコーダーの指定¶
ここでは 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. エンコーダーとデコーダーを指定する¶
// 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 インスタンスの宣言
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,
};
}