Захват аудио Pixel Streaming
Pixel Streaming — это плагин для Unreal Engine, который транслирует отрендеренные кадры и синхронизирует ввод/вывод через WebRTC. Приложение работает на стороне сервера, тогда как клиентская сторона занимается рендерингом и взаимодействием с пользователем. Для получения более подробной информации о Pixel Streaming и его настройке обратитесь к документации Pixel Streaming.
Pixel Streaming vs Pixel Streaming 2
Этот плагин поддерживает обе версии Pixel Streaming, доступные в Unreal Engine:
- 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 и позднее
- Для получения дополнительной информации о том, как собирать плагины вручную, см. руководство по сборке плагинов
Обзор
Capturable Sound Wave для Pixel Streaming расширяет стандартную Capturable Sound Wave, позволяя захватывать аудио непосредственно с микрофонов клиентов Pixel Streaming. Эта функция позволяет вам:
- Захватывать аудио из браузеров, подключённых через Pixel Streaming
- Обрабатывать аудио от конкретных игроков/пиров
- Реализовывать голосовой чат, голосовые команды или запись аудио от удалённых пользователей
Базовое использование
Создание Capturable Sound Wave для Pixel Streaming
Сначала вам необходимо создать объект Capturable Sound Wave для Pixel Streaming:
- 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 или используя UPROPERTY() в C++).
Запуск и остановка захвата
Вы можете запускать и останавливать захват аудио с помощью простых вызовов функций:
- 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++
Используйте те же узлы Start Capture и Stop Capture с вашей Capturable Sound Wave для Pixel Streaming 2
// 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();
Параметр DeviceId в StartCapture игнорируется для 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 с вашей Capturable Sound Wave для 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.
В примере используется функция CapturePixelStreamingAudioExample, расположенная в классе UPixelStreamingAudioExample внутри модуля EXAMPLEMODULE.
Для успешного запуска примера убедитесь, что вы добавили модули RuntimeAudioImporter и PixelStreaming либо в PublicDependencyModuleNames, либо в PrivateDependencyModuleNames в файле .Build.cs, а также в файл .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.
Пример использует функцию CapturePixelStreaming2AudioExample, расположенную в классе UPixelStreaming2AudioExample внутри модуля EXAMPLEMODULE.
Для успешного запуска примера убедитесь, что вы добавили модули RuntimeAudioImporter и PixelStreaming2 либо в PublicDependencyModuleNames, либо в PrivateDependencyModuleNames в файле .Build.cs, а также в файл .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 с вашей Capturable Sound Wave для Pixel Streaming 2
// Assuming PixelStreamingSoundWave is a reference to a UPixelStreaming2CapturableSoundWave object
// and PlayerInfo is a FPixelStreaming2PlayerInfo_RAI object from GetAvailablePixelStreaming2Players
PixelStreamingSoundWave->PlayerInfo = PlayerInfo;
Если вы оставите Player ID пустым, звуковая волна будет автоматически слушать первого доступного игрока, который подключится. Это поведение по умолчанию, которое хорошо работает для сценариев с одним игроком.
Распространенные сценарии использования
Реализация голосового чата
Вы можете использовать Pixel Streaming Capturable Sound Waves для реализации голосового чата между удаленными пользователями и локальными игроками:
- Создайте Pixel Streaming Capturable Sound Wave для каждого подключенного игрока
- Настройте систему для управления тем, какие игроки в данный момент говорят
- Используйте систему Обнаружения голосовой активности для определения, когда пользователи говорят
- При необходимости пространственно обработайте аудио с помощью аудиосистемы Unreal Engine
Голосовые команды с распознаванием речи
Вы можете реализовать распознавание голосовых команд для удаленных пользователей, комбинируя эту функцию с плагином Runtime Speech Recognizer:
- Захватывайте аудио от клиентов Pixel Streaming с помощью Pixel Streaming Capturable Sound Wave
- Подавайте захваченное аудио напрямую в Runtime Speech Recognizer
- Обрабатывайте распознанный текст в вашей игровой логике
Просто замените стандартную Capturable Sound Wave на Pixel Streaming Capturable Sound Wave (или Pixel Streaming 2 Capturable Sound Wave) в примерах Runtime Speech Recognizer, и она будет работать с аудиовходом Pixel Streaming.
Запись аудио удаленных пользователей
Вы можете записывать аудио от удаленных пользователей для последующего воспроизведения:
- Захватывайте аудио с помощью Pixel Streaming Capturable Sound Wave
- Экспортируйте захваченное аудио в файл с помощью Export Audio
- Сохраните файл для последующего использования или анализа