Pixel Streaming オーディオキャプチャ
Pixel Streamingは、Unreal Engineのプラグインで、レンダリングされたフレームをストリーミングし、WebRTCを介して入出力を同期します。アプリケーションはサーバー側で実行され、クライアント側はレンダリングとユーザーインタラクションを処理します。Pixel Streamingとセットアップの詳細については、Pixel Streaming ドキュメントを参照してください。
Pixel Streaming vs 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 vs 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バージョン用の拡張プラグインをダウンロードしてください:
- ダウンロードしたアーカイブからフォルダを抽出し、プロジェクトの
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 が早期に破棄されないようにするため、強い参照として扱うべきです(例えば、ブループリントで別の変数に割り当てるか、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 の Capturable Sound Wave で使用します
// 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を使用してキャプチャした音声をファイルにエクスポートします
- 後で使用または分析するためにファイルを保存します