Захват Аудио для Pixel Streaming
Pixel Streaming - это плагин для Unreal Engine, который передает поток рендерингных кадров и синхронизирует ввод/вывод через WebRTC. Приложение работает на стороне сервера, в то время как клиентская сторона обрабатывает рендеринг и взаимодействие с пользователем. Для получения дополнительной информации о Pixel Streaming и настройке, обратитесь к Документации по Pixel Streaming.
Совместимость
Это решение работает с:
- Официальной инфраструктурой 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 Audio Capture из Google Drive
- Извлечь папку из загруженного архива в папку
Plugins
вашего проекта (создайте эту папку, если она не существует) - Пересобрать ваш проект (это расширение требует проект C++)
- Это расширение предоставляется в виде исходного кода и требует проект C++ для использования
- Поддерживаемые версии Unreal Engine: UE 5.2 и более поздние
- Для получения дополнительной информации о том, как вручную собирать плагины, см. Учебник по созданию плагинов
Обзор
Pixel Streaming Capturable Sound Wave расширяет стандартный Capturable Sound Wave, чтобы позволить захватывать аудио непосредственно с микрофонов клиентов Pixel Streaming. Эта функция позволяет вам:
- Захватывать аудио из браузеров, подключенных через Pixel Streaming
- Обрабатывать аудио от конкретных игроков/пиров
- Реализовать голосовой чат, голосовые команды или аудиозапись от удаленных пользователей
Основное Использование
Создание Pixel Streaming Capturable Sound Wave
Сначала вам нужно создать объект Pixel Streaming Capturable Sound Wave:
- Blueprint
- C++
PixelStreamingSoundWave = UPixelStreamingCapturableSoundWave::CreatePixelStreamingCapturableSoundWave();
Вы должны рассматривать Pixel Streaming Capturable Sound Wave как сильную ссылку, чтобы предотвратить преждевременное уничтожение (например, присвоив его отдельной переменной в Blueprints или используя UPROPERTY()
в C++).
Начало и остановка захвата
Вы можете начать и остановить захват аудио с помощью простых вызовов функций:
- 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();
Параметр DeviceId
в StartCapture
игнорируется для Pixel Streaming Capturable Sound Waves, так как источник захвата определяется автоматически или по информации, которую вы задали для игрока.
Проверка статуса захвата
Вы можете проверить, захватывает ли в данный момент аудио звуковая волна:
- Blueprint
- C++
// Assuming PixelStreamingSoundWave is a reference to a UPixelStreamingCapturableSoundWave object
bool bIsCapturing = PixelStreamingSoundWave->IsCapturing();
Полный Пример
Вот полный пример настройки захвата аудио в Pixel Streaming:
- 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);
}
Работа с несколькими Pixel Streaming плеерами
В сценариях, когда у вас несколько клиентов Pixel Streaming подключены одновременно, возможно, вам потребуется захватить аудио от конкретных плееров. Следующие функции помогут вам управлять этим.
Получение доступных Pixel Streaming плееров
Чтобы определить, какие Pixel Streaming плееры подключены:
- 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++
// Assuming PixelStreamingSoundWave is a reference to a UPixelStreamingCapturableSoundWave object
// and PlayerInfo is a FPixelStreamingPlayerInfo_RAI object from GetAvailablePixelStreamingPlayers
PixelStreamingSoundWave->PlayerInfo = PlayerInfo;
Если вы оставите ID игрока пустым, звуковая волна автоматически будет прослушивать первого доступного игрока, который подключится. Это поведение по умолчанию и хорошо работает для однопользовательских сценариев.
Общие сценарии использования
Реализация голосового чата
Вы можете использовать Pixel Streaming Capturable Sound Waves для реализации голосового чата между удаленными пользователями и локальными игроками:
- Создайте Pixel Streaming Capturable Sound Wave для каждого подключенного игрока
- Настройте систему для управления, какие игроки в данный момент говорят
- Используйте систему Voice Activity Detection для обнаружения, когда пользователи говорят
- Пространственно обработайте аудио с использованием аудиосистемы Unreal Engine, если это необходимо
Голосовые команды с распознаванием речи
Вы можете реализовать распознавание голосовых коман д для удаленных пользователей, комбинируя эту функцию с плагином Runtime Speech Recognizer:
- Захватывайте аудио от клиентов Pixel Streaming с использованием Pixel Streaming Capturable Sound Wave
- Передайте захваченное аудио непосредственно в Runtime Speech Recognizer
- Обработайте распознанный текст в игровой логике
Просто замените стандартную Capturable Sound Wave на Pixel Streaming Capturable Sound Wave в примерах Runtime Speech Recognizer, и это будет работать без сбоев с аудиовходом Pixel Streaming.
Запись аудио удаленного пользователя
Вы можете записывать аудио от удаленных пользователей для последующего воспроизведения:
- Захватывайте аудио с помощью Pixel Streaming Capturable Sound Wave
- Экспортируйте захваченное аудио в файл, используя Export Audio
- Сохраните файл для дальнейшего использования или анализа