Przechwytywanie dźwięku w Pixel Streaming
Pixel Streaming to wtyczka do Unreal Engine, która przesyła strumieniowo renderowane klatki i synchronizuje wejście/wyjście za pośrednictwem WebRTC. Aplikacja działa po stronie serwera, podczas gdy strona klienta obsługuje renderowanie i interakcję użytkownika. Aby uzyskać więcej szczegółów na temat Pixel Streaming i konfiguracji, zapoznaj się z Dokumentacją Pixel Streaming.
Pixel Streaming vs Pixel Streaming 2
Ta wtyczka obsługuje obie wersje Pixel Streaming dostępne w Unreal Engine:
- Pixel Streaming - Oryginalna wtyczka, dostępna od UE 5.2 i nadal aktywnie używana w obecnych wersjach silnika
- Pixel Streaming 2 - Wprowadzona w UE 5.5 jako implementacja nowej generacji z ulepszoną architekturą wewnętrzną. Dowiedz się więcej o Pixel Streaming 2
Obie wersje są w pełni obsługiwane i dostępne w najnowszych wydaniach Unreal Engine. Wybierz wersję odpowiadającą konfiguracji Pixel Streaming w twoim projekcie.
API dla obu wersji jest identyczne, jedyną różnicą jest to, że klasy i funkcje Pixel Streaming 2 zawierają "2" w swoich nazwach (np. UPixelStreamingCapturableSoundWave vs UPixelStreaming2CapturableSoundWave).
Kompatybilność
To rozwiązanie działa z:
- Oficjalną infrastrukturą Pixel Streaming (Implementacja referencyjna Epic Games)
- Zewnętrznymi dostawcami Pixel Streaming, w tym:
- Vagon.io
- Arcane Mirage
- Eagle 3D Streaming
- Inne rozwiązania strumieniowania oparte na WebRTC
- Systemami operacyjnymi: Serwery Windows i Linux
Implementacja została przetestowana w tych środowiskach i działa poprawnie niezależnie od używanego rozwiązania hostingu Pixel Streaming.
Instalacja wtyczki rozszerzenia
Ta funkcja jest dostarczana jako rozszerzenie wtyczki Runtime Audio Importer. Aby z niej korzystać, musisz:
- Upewnić się, że wtyczka Runtime Audio Importer jest już zainstalowana w twoim projekcie
- Pobrać wtyczkę rozszerzenia dla twojej wersji Pixel Streaming:
- Wypakować folder z pobranego archiwum do folderu
Pluginstwojego projektu (utwórz ten folder, jeśli nie istnieje) - Przebudować projekt (to rozszerzenie wymaga projektu C++)
- Te rozszerzenia są dostarczane jako kod źródłowy i wymagają projektu C++ do użycia
- Rozszerzenie Pixel Streaming: Obsługiwane w UE 5.2 i nowszych
- Rozszerzenie Pixel Streaming 2: Obsługiwane w UE 5.5 i nowszych
- Aby uzyskać więcej informacji na temat ręcznego budowania wtyczek, zobacz Samouczek budowania wtyczek
Przegląd
Pixel Streaming Capturable Sound Wave rozszerza standardową Capturable Sound Wave, umożliwiając przechwytywanie dźwięku bezpośrednio z mikrofonów klientów Pixel Streaming. Ta funkcja pozwala na:
- Przechwytywanie dźwięku z przeglądarek połączonych przez Pixel Streaming
- Przetwarzanie dźwięku od określonych graczy/peerów
- Implementację czatu głosowego, poleceń głosowych lub nagrywania dźwięku od zdalnych użytkowników
Podstawowe użycie
Tworzenie Pixel Streaming Capturable Sound Wave
Najpierw musisz utworzyć obiekt Pixel Streaming Capturable Sound Wave:
- Pixel Streaming
- Pixel Streaming 2
- Blueprint
- C++
![]()
PixelStreamingSoundWave = UPixelStreamingCapturableSoundWave::CreatePixelStreamingCapturableSoundWave();
- Blueprint
- C++
Użyj węzła Create Pixel Streaming 2 Capturable Sound Wave (takiego samego jak dla Pixel Streaming, ale z "2" w nazwie)
PixelStreamingSoundWave = UPixelStreaming2CapturableSoundWave::CreatePixelStreaming2CapturableSoundWave();
Należy traktować Pixel Streaming Capturable Sound Wave jako silną referencję, aby zapobiec przedwczesnemu zniszczeniu (np. przypisując ją do osobnej zmiennej w Blueprints lub używając UPROPERTY() w C++).
Rozpoczynanie i Zatrzymywanie Przechwytywania
Możesz rozpocząć i zatrzymać przechwytywanie dźwięku za pomocą prostych wywołań funkcji:
- 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++
Użyj tych samych węzłów Start Capture i Stop Capture ze swoją Capturable Sound Wave dla 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();
Parametr DeviceId w StartCapture jest ignorowany dla Pixel Streaming Capturable Sound Waves, ponieważ źródło przechwytywania jest określane automatycznie lub przez ustawione informacje o graczu.
Sprawdzanie Statusu Przechwytywania
Możesz sprawdzić, czy fala dźwiękowa aktualnie przechwytuje audio:
- Pixel Streaming
- Pixel Streaming 2
- Blueprint
- C++

// Assuming PixelStreamingSoundWave is a reference to a UPixelStreamingCapturableSoundWave object
bool bIsCapturing = PixelStreamingSoundWave->IsCapturing();
- Blueprint
- C++
Użyj tego samego węzła Is Capturing ze swoją przechwytywalną falą dźwiękową Pixel Streaming 2
// Assuming PixelStreamingSoundWave is a reference to a UPixelStreaming2CapturableSoundWave object
bool bIsCapturing = PixelStreamingSoundWave->IsCapturing();
Kompletny Przykład
Oto kompletny przykład konfiguracji przechwytywania audio w Pixel Streaming:
- Pixel Streaming
- Pixel Streaming 2
- Blueprint
- C++
![]()
To jest podstawowy przykład kodu do przechwytywania danych audio z klienta Pixel Streaming.
Przykład używa funkcji CapturePixelStreamingAudioExample znajdującej się w klasie UPixelStreamingAudioExample wewnątrz modułu EXAMPLEMODULE.
Aby pomyślnie uruchomić przykład, upewnij się, że dodałeś zarówno moduły RuntimeAudioImporter, jak i PixelStreaming do PublicDependencyModuleNames lub PrivateDependencyModuleNames w pliku .Build.cs, a także do pliku .uproject twojego projektu.
#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++
Konfiguracja w Blueprint jest identyczna jak w przypadku Pixel Streaming, ale należy użyć węzła Create Pixel Streaming 2 Capturable Sound Wave zamiast
To jest podstawowy przykład kodu do przechwytywania danych audio z klienta Pixel Streaming 2.
Przykład używa funkcji CapturePixelStreaming2AudioExample znajdującej się w klasie UPixelStreaming2AudioExample wewnątrz modułu EXAMPLEMODULE.
Aby pomyślnie uruchomić przykład, upewnij się, że dodałeś zarówno moduły RuntimeAudioImporter, jak i PixelStreaming2 do PublicDependencyModuleNames lub PrivateDependencyModuleNames w pliku .Build.cs, a także do pliku .uproject swojego projektu.
#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);
}
Praca z wieloma odtwarzaczami Pixel Streaming
W scenariuszach, w których jednocześnie podłączonych jest wielu klientów Pixel Streaming, może być konieczne przechwytywanie dźwięku z określonych odtwarzaczy. Poniższe funkcje pomagają w zarządzaniu tym.
Pobieranie dostępnych odtwarzaczy Pixel Streaming
Aby zidentyfikować, które odtwarzacze Pixel Streaming są podłączone:
- 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++
Użyj węzła 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);
}
}));
Ustawianie Gracza do Przechwytywania
Gdy musisz przechwytywać od konkretnego gracza:
- 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++
Użyj węzła Set Player To Capture From ze swoją 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;
Jeśli pozostawisz ID Gracza puste, fala dźwiękowa automatycznie będzie nasłuchiwać pierwszego dostępnego gracza, który się połączy. Jest to domyślne zachowanie, które dobrze sprawdza się w scenariuszach dla jednego gracza.
Typowe przypadki użycia
Implementacja czatu głosowego
Możesz użyć Pixel Streaming Capturable Sound Waves do zaimplementowania czatu głosowego między zdalnymi użytkownikami a lokalnymi graczami:
- Utwórz Pixel Streaming Capturable Sound Wave dla każdego połączonego gracza
- Skonfiguruj system do zarządzania tym, którzy gracze aktualnie mówią
- Użyj systemu Wykrywania aktywności głosowej, aby wykryć, kiedy użytkownicy mówią
- Przestrzenny dźwięk za pomocą systemu audio Unreal Engine, jeśli jest to potrzebne
Komendy głosowe z rozpoznawaniem mowy
Możesz zaimplementować rozpoznawanie komend głosowych dla zdalnych użytkowników, łącząc tę funkcję z wtyczką Runtime Speech Recognizer:
- Przechwyć audio od klientów Pixel Streaming za pomocą Pixel Streaming Capturable Sound Wave
- Przekaż przechwycone audio bezpośrednio do Runtime Speech Recognizer
- Przetwórz rozpoznany tekst w logice swojej gry
Po prostu zastąp standardowe Capturable Sound Wave w przykładach Runtime Speech Recognizer przez Pixel Streaming Capturable Sound Wave (lub Pixel Streaming 2 Capturable Sound Wave), a będzie to działać bezproblemowo z wejściem audio Pixel Streaming.
Nagrywanie audio zdalnych użytkowników
Możesz nagrywać audio od zdalnych użytkowników do późniejszego odtworzenia:
- Przechwyć audio za pomocą Pixel Streaming Capturable Sound Wave
- Eksportuj przechwycone audio do pliku za pomocą Eksportuj Audio
- Zapisz plik do późniejszego użycia lub analizy