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.
Zgodność
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
- Innymi rozwiązaniami streamingu opartymi na WebRTC
- Systemami operacyjnymi: Serwery Windows i Linux
Implementacja została przetestowana w tych środowiskach i działa poprawnie niezależnie od użytego rozwiązania hostującego Pixel Streaming.
Instalacja wtyczki rozszerzenia
Ta funkcja jest dostarczana jako rozszerzenie wtyczki Runtime Audio Importer. Aby z niej skorzystać, musisz:
- Upewnij się, że wtyczka Runtime Audio Importer jest już zainstalowana w twoim projekcie
- Pobierz rozszerzenie wtyczki Pixel Streaming Audio Capture z Dysku Google
- Wypakuj folder z pobranego archiwum do folderu
Plugins
twojego projektu (utwórz ten folder, jeśli nie istnieje) - Przebuduj swój projekt (to rozszerzenie wymaga projektu C++)
- To rozszerzenie jest dostarczane jako kod źródłowy i wymaga projektu C++ do użycia
- Obsługiwane wersje Unreal Engine: UE 5.2 i nowsze
- Aby uzyskać więcej informacji na temat ręcznego budowania wtyczek, zobacz samouczek Budowanie 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 konkretnych 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:
- Blueprint
- C++
PixelStreamingSoundWave = UPixelStreamingCapturableSoundWave::CreatePixelStreamingCapturableSoundWave();
Powinieneś 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:
- 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();
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:
- Blueprint
- C++
// Assuming PixelStreamingSoundWave is a reference to a UPixelStreamingCapturableSoundWave object
bool bIsCapturing = PixelStreamingSoundWave->IsCapturing();
Kompletny przykład
Oto kompletny przykład konfiguracji przechwytywania dźwięku Pixel Streaming:
- 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
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);
}
Praca z wieloma odtwarzaczami Pixel Streaming
W scenariuszach, w których masz wielu klientów Pixel Streaming połączonych jednocześnie, możesz potrzebować przechwytywać dźwięk 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ą połączone:
- 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);
}
}));
Ustawianie Gracza do Przechwytywania
Kiedy potrzebujesz przechwytywać od konkretnego gracza:
- Blueprint
- C++
// Assuming PixelStreamingSoundWave is a reference to a UPixelStreamingCapturableSoundWave object
// and PlayerInfo is a FPixelStreamingPlayerInfo_RAI object from GetAvailablePixelStreamingPlayers
PixelStreamingSoundWave->PlayerInfo = PlayerInfo;
Jeśli pozostawisz identyfikator gracza pusty, 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 podłączonego gracza
- Skonfiguruj system do zarządzania tym, którzy gracze aktualnie mówią
- Użyj systemu Voice Activity Detection do wykrywania, kiedy użytkownicy mówią
- Przestrzennie zlokalizuj 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 Pixel Streaming Capturable Sound Wave w przykładach Runtime Speech Recognizer, a będzie to działać bezproblemowo z wejściem audio Pixel Streaming.
Nagrywanie dźwięku zdalnego użytkownika
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 Export Audio
- Zapisz plik do późniejszego użycia lub analizy