Захват аудио в 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:
- 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 или используя 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, и она будет работать seamlessly с аудиовводом Pixel Streaming.
Запись аудио удаленных пользователей
Вы можете записывать аудио от удаленных пользователей для последующего воспроизведения:
- Записывайте аудио с помощью Pixel Streaming Capturable Sound Wave
- Экспортируйте записанное аудио в файл с помощью Экспорт аудио
- Сохраните файл для последующего использования или анализа