Pixel Streaming オーディオキャプチャ
Pixel Streaming は、Unreal Engine 用のプラグインで、レンダリングされたフレームをストリーミングし、WebRTC を介して入出力を同期します。アプリケーションはサーバー側で実行され、クライアント側はレンダリングとユーザーインタラクションを処理します。Pixel Streaming とそのセットアップの詳細については、Pixel Streaming ドキュメントを参照してください。
Pixel Streaming 対 Pixel Streaming 2
このプラグインは、Unreal Engine で利用可能な両方の Pixel Streaming バージョンをサポートしています:
- Pixel Streaming - 元のプラグイン。UE 5.2 以降で利用可能で、現在のエンジンバージョンでも引き続き積極的に使用されています
- Pixel Streaming 2 - UE 5.5 で導入された、改良された内部アーキテクチャを備えた次世代実装。Pixel Streaming 2 の詳細
両バージョンは完全にサポートされており、最新の Unreal Engine リリースで利用できます。プロジェクトの Pixel Streaming セットアップに合ったバージョンを選択してください。
両バージョンの API は同一で、唯一の違いは、Pixel Streaming 2 のクラスと関数名に "2" が含まれることです(例: UPixelStreamingCapturableSoundWave 対 UPixelStreaming2CapturableSoundWave)。
互換性
このソリューションは以下で動作します:
- 公式 Pixel Streaming インフラストラクチャ (Epic Games リファレンス実装)
- サードパーティ製 Pixel Streaming プロバイダ を含む:
- Vagon.io
- Arcane Mirage
- Eagle 3D Streaming
- その他の WebRTC ベースのストリーミングソリューション
- オペレーティングシステム: Windows および Linux サーバー
この実装は、これらの環境全体でテストされており、使用される Pixel Streaming ホスティングソリューションに関係なく正しく機能します。
拡張プラグインのインストール
この機能は、Runtime Audio Importer プラグインの拡張として提供されています。これを使用するには、以下を行う必要があります:
- Runtime Audio Importer プラグインがプロジェクトに既にインストールされていることを確認してください
- 使用する Pixel Streaming バージョン用の拡張プラグインをダウンロードしてください:
- Pixel Streaming: Google Drive からダウンロード
- Pixel Streaming 2: Google Drive からダウンロード
- ダウンロードしたアーカイブからフォルダを抽出し、プロジェクトの
Pluginsフォルダに配置します(このフォルダが存在しない場合は作成してください) - プロジェクトをリビルドしてください(この拡張機能には C++ プロジェクトが必要です)
- これらの拡張機能はソースコードとして提供され、C++プロジェクトが必要です
- Pixel Streaming 拡張機能: UE 5.2以降でサポート
- Pixel Streaming 2 拡張機能: UE 5.5以降でサポート
- プラグインの手動ビルド方法の詳細については、プラグインビルドチュートリアルを参照してください
概要
Pixel Streaming Capturable Sound Waveは、標準のCapturable Sound Waveを拡張し、Pixel Streamingクライアントのマイクから直接オーディオをキャプチャできるようにします。この機能により以下が可能になります:
- Pixel Streaming経由で接続されたブラウザからのオーディオキャプチャ
- 特定のプレイヤー/ピアからのオーディオ処理
- リモートユーザーからのボイスチャット、音声コマンド、またはオーディオ録音の実装
基本的な使用方法
Pixel Streaming Capturable Sound Waveの作成
まず、Pixel Streaming Capturable Sound Waveオブジェクトを作成する必要があります:
- Pixel Streaming
- Pixel Streaming 2
- Blueprint
- C++
![]()
PixelStreamingSoundWave = UPixelStreamingCapturableSoundWave::CreatePixelStreamingCapturableSoundWave();
- Blueprint
- C++
Create Pixel Streaming 2 Capturable Sound Wave ノードを使用します(Pixel Streaming と同じですが、名前に「2」が付いています)
PixelStreamingSoundWave = UPixelStreaming2CapturableSoundWave::CreatePixelStreaming2CapturableSoundWave();
Pixel Streaming Capturable Sound Wave を早期破棄を防ぐため、強い参照として扱う必要があります(例:Blueprints で別の変数に割り当てる、または C++ で UPROPERTY() を使用する)。
キャプチャの開始と停止
シンプルな関数呼び出しでオーディオキャプチャを開始および停止できます:
- Pixel Streaming
- Pixel Streaming 2
- Blueprint
- C++

// Assuming PixelStreamingSoundWave is a reference to a UPixelStreamingCapturableSoundWave object
// Start capturing audio (the device ID parameter is ignored for Pixel Streaming)
PixelStreamingSoundWave->StartCapture(0);
// Stop capturing audio
PixelStreamingSoundWave->StopCapture();
- Blueprint
- C++
Pixel Streaming 2 キャプチャ可能サウンドウェーブで同じ Start Capture および Stop Capture ノードを使用します
// Assuming PixelStreamingSoundWave is a reference to a UPixelStreaming2CapturableSoundWave object
// Start capturing audio (the device ID parameter is ignored for Pixel Streaming 2)
PixelStreamingSoundWave->StartCapture(0);
// Stop capturing audio
PixelStreamingSoundWave->StopCapture();
StartCaptureのDeviceIdパラメータは、Pixel Streaming Capturable Sound Wavesでは無視されます。キャプチャソースは自動的に決定されるか、設定したプレイヤー情報によって決定されるためです。
キャプチャステータスの確認
サウンドウェーブが現在オーディオをキャプチャしているかどうかを確認できます:
- Pixel Streaming
- Pixel Streaming 2
- Blueprint
- C++

// Assuming PixelStreamingSoundWave is a reference to a UPixelStreamingCapturableSoundWave object
bool bIsCapturing = PixelStreamingSoundWave->IsCapturing();
- Blueprint
- C++
同じ Is Capturing ノードを Pixel Streaming 2 のキャプチャ可能なサウンドウェーブで使用します
// Assuming PixelStreamingSoundWave is a reference to a UPixelStreaming2CapturableSoundWave object
bool bIsCapturing = PixelStreamingSoundWave->IsCapturing();
完全な例
以下は、Pixel Streaming のオーディオキャプチャを設定する完全な例です:
- Pixel Streaming
- Pixel Streaming 2
- Blueprint
- C++
![]()
これは、Pixel Streaming クライアントからオーディオデータをキャプチャするための基本的なコード例です。
この例では、EXAMPLEMODULE モジュール内の UPixelStreamingAudioExample クラスにある CapturePixelStreamingAudioExample 関数を使用しています。
この例を正常に実行するには、RuntimeAudioImporter と PixelStreaming モジュールの両方を、.Build.cs ファイルの PublicDependencyModuleNames または PrivateDependencyModuleNames に、そしてプロジェクトの .uproject ファイルに追加してください。
#pragma once
#include "CoreMinimal.h"
#include "UObject/Object.h"
#include "PixelStreamingAudioExample.generated.h"
UCLASS(BlueprintType)
class EXAMPLEMODULE_API UPixelStreamingAudioExample : public UObject
{
GENERATED_BODY()
public:
UFUNCTION(BlueprintCallable)
void CapturePixelStreamingAudioExample();
private:
// Keep a strong reference to prevent garbage collection
UPROPERTY()
class UPixelStreamingCapturableSoundWave* PixelStreamingSoundWave;
};
#include "PixelStreamingAudioExample.h"
#include "Sound/PixelStreamingCapturableSoundWave.h"
#include "Kismet/GameplayStatics.h"
void UPixelStreamingAudioExample::CapturePixelStreamingAudioExample()
{
// Create a Pixel Streaming Capturable Sound Wave
PixelStreamingSoundWave = UPixelStreamingCapturableSoundWave::CreatePixelStreamingCapturableSoundWave();
// Start capturing audio
PixelStreamingSoundWave->StartCapture(0);
// Play the sound wave to hear the captured audio
UGameplayStatics::PlaySound2D(GetWorld(), PixelStreamingSoundWave);
// Set up a timer to stop capture after 30 seconds (just for demonstration)
FTimerHandle TimerHandle;
GetWorld()->GetTimerManager().SetTimer(TimerHandle, [this]()
{
PixelStreamingSoundWave->StopCapture();
}, 30.0f, false);
}
- Blueprint
- C++
Blueprintの設定はPixel Streamingと同じですが、代わりに Create Pixel Streaming 2 Capturable Sound Wave ノードを使用してください
これはPixel Streaming 2クライアントからオーディオデータをキャプチャするための基本的なコード例です。
この例では、EXAMPLEMODULEモジュール内のUPixelStreaming2AudioExampleクラスにあるCapturePixelStreaming2AudioExample関数を使用しています。
この例を正常に実行するには、RuntimeAudioImporterモジュールとPixelStreaming2モジュールの両方を、.Build.csファイルのPublicDependencyModuleNamesまたはPrivateDependencyModuleNamesに追加し、プロジェクトの**.uproject**ファイルにも追加してください。
#pragma once
#include "CoreMinimal.h"
#include "UObject/Object.h"
#include "PixelStreaming2AudioExample.generated.h"
UCLASS(BlueprintType)
class EXAMPLEMODULE_API UPixelStreaming2AudioExample : public UObject
{
GENERATED_BODY()
public:
UFUNCTION(BlueprintCallable)
void CapturePixelStreaming2AudioExample();
private:
// Keep a strong reference to prevent garbage collection
UPROPERTY()
class UPixelStreaming2CapturableSoundWave* PixelStreamingSoundWave;
};
#include "PixelStreaming2AudioExample.h"
#include "Sound/PixelStreaming2CapturableSoundWave.h"
#include "Kismet/GameplayStatics.h"
void UPixelStreaming2AudioExample::CapturePixelStreaming2AudioExample()
{
// Create a Pixel Streaming 2 Capturable Sound Wave
PixelStreamingSoundWave = UPixelStreaming2CapturableSoundWave::CreatePixelStreaming2CapturableSoundWave();
// Start capturing audio
PixelStreamingSoundWave->StartCapture(0);
// Play the sound wave to hear the captured audio
UGameplayStatics::PlaySound2D(GetWorld(), PixelStreamingSoundWave);
// Set up a timer to stop capture after 30 seconds (just for demonstration)
FTimerHandle TimerHandle;
GetWorld()->GetTimerManager().SetTimer(TimerHandle, [this]()
{
PixelStreamingSoundWave->StopCapture();
}, 30.0f, false);
}
複数の Pixel Streaming プレイヤーとの連携
複数の Pixel Streaming クライアントが同時に接続されているシナリオでは、特定のプレイヤーから音声をキャプチャする必要がある場合があります。以下の機能がこれを管理するのに役立ちます。
利用可能な Pixel Streaming プレイヤーの取得
接続されている Pixel Streaming プレイヤーを識別するには:
- Pixel Streaming
- Pixel Streaming 2
- Blueprint
- C++
![]()
UPixelStreamingCapturableSoundWave::GetAvailablePixelStreamingPlayers(FOnGetAvailablePixelStreamingPlayersResultNative::CreateWeakLambda(this, [](const TArray<FPixelStreamingPlayerInfo_RAI>& AvailablePlayers)
{
// Handle the list of available players
for (const FPixelStreamingPlayerInfo_RAI& PlayerInfo : AvailablePlayers)
{
UE_LOG(LogTemp, Log, TEXT("Available player: %s on streamer: %s"), *PlayerInfo.PlayerId, *PlayerInfo.StreamerId);
}
}));
- Blueprint
- C++
Get Available Pixel Streaming 2 Players ノードを使用します
UPixelStreaming2CapturableSoundWave::GetAvailablePixelStreaming2Players(FOnGetAvailablePixelStreaming2PlayersResultNative::CreateWeakLambda(this, [](const TArray<FPixelStreaming2PlayerInfo_RAI>& AvailablePlayers)
{
// Handle the list of available players
for (const FPixelStreaming2PlayerInfo_RAI& PlayerInfo : AvailablePlayers)
{
UE_LOG(LogTemp, Log, TEXT("Available player: %s on streamer: %s"), *PlayerInfo.PlayerId, *PlayerInfo.StreamerId);
}
}));
キャプチャ元のプレイヤーを設定する
特定のプレイヤーからキャプチャする必要がある場合:
- Pixel Streaming
- Pixel Streaming 2
- Blueprint
- C++

// Assuming PixelStreamingSoundWave is a reference to a UPixelStreamingCapturableSoundWave object
// and PlayerInfo is a FPixelStreamingPlayerInfo_RAI object from GetAvailablePixelStreamingPlayers
PixelStreamingSoundWave->PlayerInfo = PlayerInfo;
- Blueprint
- C++
Set Player To Capture From ノードを Pixel Streaming 2 Capturable Sound Wave と共に使用します
// Assuming PixelStreamingSoundWave is a reference to a UPixelStreaming2CapturableSoundWave object
// and PlayerInfo is a FPixelStreaming2PlayerInfo_RAI object from GetAvailablePixelStreaming2Players
PixelStreamingSoundWave->PlayerInfo = PlayerInfo;
プレイヤーIDを空のままにすると、接続した最初の利用可能なプレイヤーを自動的にリッスンします。これはデフォルトの動作であり、シングルプレイヤーのシナリオでうまく機能します。
一般的なユースケース
ボイスチャットの実装
リモートユーザーとローカルプレイヤー間のボイスチャットを実装するために、Pixel Streaming Capturable Sound Waveを使用できます:
- 接続された各プレイヤーに対してPixel Streaming Capturable Sound Waveを作成します
- 現在発話中のプレイヤーを管理するシステムを設定します
- Voice Activity Detection システムを使用して、ユーザーが発話しているタイミングを検出します
- 必要に応じてUnreal Engineのオーディオシステムを使用してオーディオを空間化します
音声認識による音声コマンド
この機能を Runtime Speech Recognizer プラグインと組み合わせることで、リモートユーザーのための音声コマンド認識を実装できます:
- Pixel Streaming Capturable Sound Waveを使用してPixel Streamingクライアントからのオーディオをキャプチャします
- キャプチャしたオーディオを直接Runtime Speech Recognizerに供給します
- 認識されたテキストをゲームロジックで処理します
Runtime Speech Recognizerの例で標準のCapturable Sound WaveをPixel Streaming Capturable Sound Wave(またはPixel Streaming 2 Capturable Sound Wave)に置き換えるだけで、Pixel Streamingのオーディオ入力とシームレスに動作します。
リモートユーザーのオーディオ録音
後で再生するためにリモートユーザーからのオーディオを録音できます:
- Pixel Streaming Capturable Sound Waveを使用してオーディオをキャプチャします
- Export Audio を使用してキャプチャしたオーディオをファイルにエクスポートします
- 後で使用または分析するためにファイルを保存します