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 następnej 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 (w tym UE 5.6). Wybierz wersję odpowiadającą konfiguracji Pixel Streaming w twoim projekcie.
API dla obu wersji jest identyczne, z tą tylko różnicą, ż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)
- Dostawcami Pixel Streaming stron trzecich, 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 funkcjonalność jest dostarczana jako rozszerzenie do wtyczki Runtime Audio Importer. Aby jej użyć, musisz:
- Upewnij się, że wtyczka Runtime Audio Importer jest już zainstalowana w twoim projekcie
- Pobierz wtyczkę rozszerzenia dla twojej wersji Pixel Streaming:
- Pixel Streaming: Pobierz z Google Drive
- Pixel Streaming 2: Pobierz z Google Drive
- Wypakuj folder z pobranego archiwum do folderu
Pluginstwojego projektu (utwórz ten folder, jeśli nie istnieje) - Przebuduj swój projekt (to rozszerzenie wymaga projektu C++) :::ważne
- 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 Building Plugins :::
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 konkretnych graczy/peerów
- Implementację czatu głosowego, komend 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 (tak samo jak Pixel Streaming, ale z "2" w nazwie)
PixelStreamingSoundWave = UPixelStreaming2CapturableSoundWave::CreatePixelStreaming2CapturableSoundWave();
Powinieneś traktować Pixel Streaming Capturable Sound Wave jako silne odniesienie, aby zapobiec przedwczesnemu zniszczeniu (np. przypisując ją do oddzielnej 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 w 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 dźwięk:
- 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 z twoją Capturable Sound Wave w 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 dźwięku Pixel Streaming:
- Pixel Streaming
- Pixel Streaming 2
- Blueprint
- C++
![]()
To jest podstawowy przykład kodu do przechwytywania danych dźwiękowych z klienta Pixel Streaming.
Przykład używa funkcji CapturePixelStreamingAudioExample znajdującej się w klasie UPixelStreamingAudioExample w module 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 Blueprint jest identyczna jak w przypadku Pixel Streaming, ale zamiast tego użyj węzła Create Pixel Streaming 2 Capturable Sound Wave
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 twojego 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 zaistnieć potrzeba przechwytywania dźwięku z określonych odtwarzaczy. Poniższe funkcje pomagają w zarządzaniu tym.
Uzyskiwanie 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
Kiedy musisz przechwytywać z określonego 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 sprawdza się dobrze w scenariuszach dla jednego gracza.
Typowe Zastosowania
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 podłączonego gracza
- Skonfiguruj system do zarządzania tym, którzy gracze aktualnie mówią
- Użyj systemu Wykrywania Aktywności Głosowej do wykrywania, kiedy użytkownicy mówią
- Przestrzennie umieść dźwięk, używając 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:
- Przechwytuj dźwięk od klientów Pixel Streaming używając Pixel Streaming Capturable Sound Wave
- Przekazuj przechwycony dźwięk bezpośrednio do Runtime Speech Recognizer
- Przetwarzaj rozpoznany tekst w logice swojej gry
Po prostu zastąp standardowe Capturable Sound Wave w przykładach Runtime Speech Recognizer wersją Pixel Streaming Capturable Sound Wave (lub Pixel Streaming 2 Capturable Sound Wave), a będzie ona działać bezproblemowo z wejściem audio Pixel Streaming.
Nagrywanie Dźwięku Zdalnych Użytkowników
Możesz nagrywać dźwięk od zdalnych użytkowników do późniejszego odtworzenia:
- Przechwytuj dźwięk używając Pixel Streaming Capturable Sound Wave
- Eksportuj przechwycony dźwięk do pliku używając Eksportuj Audio
- Zapisz plik do późniejszego użycia lub analizy